Джерси, Tomcat и аннотации безопасности

Мне нужно защитить простой RESTful API Джерси в контейнере Tomcat 6.0.24. Я хотел бы сохранить аутентификацию с помощью обычной аутентификации, используя файл tomcat-users.xml для определения пользователей и ролей (это пока, как я уже сказал, это мало).

Теперь для авторизации я хотел бы иметь возможность использовать аннотации JSR 250, такие как @RolesAllowed, @PermitAll, @DenyAll и т. д.

Я не могу на всю жизнь понять, как связать все это вместе.

Я действительно не хочу идти по маршруту Spring Security, так как в настоящее время мне нужно что-то очень простое.

Может ли кто-нибудь указать мне в правильном направлении?


person jr.    schedule 18.02.2010    source источник
comment
Поскольку вы отметили этот вопрос spring и spring-security, но вместо этого заявили, что не хотите его использовать, вы действительно используете Spring? Если нет, просто оставьте их подальше.   -  person BalusC    schedule 19.02.2010
comment
stackoverflow.com/questions/16433315/   -  person JayTee    schedule 17.01.2014


Ответы (1)


Вы можете начать с использования фильтра, который в первую очередь охватывает аутентификацию и управление привилегиями. с реализацией ResourceFilter и ContainerRequestFilter вы можете получить httpRequest, сеансы, а затем перенаправить ваше приложение/запросы на соответствующие методы.

Для управления привилегиями вы можете реализовать фильтр SecurityContext. вы должны сначала проверить isUserInRole, чтобы запрос прошел внутри метода.

Вот пример реализации SecurityContext:

 public class SecurityContextImpl implements SecurityContext {

    private final SessionUser user;

    public SecurityContextImpl(SessionUser user) {
        this.user = user;
    }

    public Principal getUserPrincipal() {
        return user;
    }

    public boolean isUserInRole(String role) {

        if(user == null) {
            throw new AuthenticationException();
        }
        if(ObjectUtil.isNull(user.getPrivileges())){
            throw new AuthenticationException();
        }
        if(!user.getPrivileges().contains(role)) {
            throw new InvalidAuthorizationHeaderException();
        }
        return user.getPrivileges().contains(role);
    }

    public boolean isSecure() {
        return false;
    }

    public String getAuthenticationScheme() {
        return SecurityContext.BASIC_AUTH;
    }
}

Вот базовая реализация SecurityContextFilter:

    public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter {

    private static final Logger LOG = LoggerFactory.getLogger(SecurityContextFilter.class);

    protected static final String HEADER_AUTHORIZATION = "Authorization";

    protected static final String HEADER_DATE = "x-java-rest-date";

    protected static final String HEADER_NONCE = "nonce";


    private HttpServletRequest httpRequest;




    public SecurityContextFilter() {


    }


    public ContainerRequest filter(ContainerRequest request) {

        SessionUser sessionUser = (SessionUser) httpRequest
                .getSession()
                .getAttribute("sessionUser");

        request.setSecurityContext(new SecurityContextImpl(sessionUser));

        return request;
    }


    public ContainerRequestFilter getRequestFilter() {
        return this;
    }

    public ContainerResponseFilter getResponseFilter() {
        return null;
    }

    public HttpServletRequest getHttpRequest() {
        return httpRequest;
    }

    public void setHttpRequest(HttpServletRequest httpRequest) {
        this.httpRequest = httpRequest;
    }


}

Не забудьте поставить свой фильтр как параметр инициализации внутри web.xml,

Затем вы можете обработать запрос с помощью логики аутентификации роли-привилегии.

person erhanasikoglu    schedule 15.01.2014