SecurityContext не работает с @RolesAllowed

в настоящее время я создаю серверный сервер, используя Джерси 2.5.1 в Tomcat 7. Для безопасности я использую @RolesAllowed, @PermitAll etc. аннотации, и я создал свой пользовательский ContainerRequestFilter и SecurityContext.

моя проблема в том, что когда мой @RolesAllowed аннотированный ресурс запрашивается, он всегда отрицает разрешение, даже если я заставляю мой isUserInRole(role) метод, чтобы возвратить true. Однако, мой filter метод вызывается. У вас есть предложения? Я вставлю соответствующий код под.

мой ContainerRequestFilter реализация:

public class AuthorizationFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext request) throws IOException
    {
        request.setSecurityContext(new Authorizer());
    }
}

мой SecurityContext реализация:

public class Authorizer implements SecurityContext
{

    @Override
    public String getAuthenticationScheme() {
        return null;
    }

    @Override
    public Principal getUserPrincipal() {
        return null;
    }

    @Override
    public boolean isSecure() {
        return false;
    }

    @Override
    public boolean isUserInRole(String role) {
        return true;
    }

}

мой ресурс:

@Path("/secure")
public class TestSecureResource {

    @GET
    @PermitAll
    @Path("/nonsec_test/{text}")
    public Response nonSecureTest(
            @PathParam("text") String text){

        return Response.status(200).entity(text).build();
    }

    @GET
    @RolesAllowed("admin")
    @Path("/sec_test/{text}")
    public Response secureTest(
            @PathParam("text") String text){

        return Response.status(200).entity(text).build();
    }
}

мой ResourceConfig:

@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        super(TestSecureResource.class);
        register(RolesAllowedDynamicFeature.class);
        register(AuthorizationFilter.class);
    }
}

соответствующие части моего web.xml:

<servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>pkg.backend</param-value>
        </init-param>

        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>pkg.backend.MyApplication</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

в этом конкретном случае мой доступ к secureTest это всегда отрицал. Чтобы прояснить вещи; я получаю код состояния HTTP 403 - запрещено.

Спасибо ребята заранее

2 ответов


убедитесь, что у вас есть свой AuthorizationFilter либо зарегистрированными в MyApplication (см. Регистрация ресурсов и поставщиков в Джерси 2) или с аннотацией @Provider (чтобы сделать его обнаруживаемым при сканировании пакетов).

для использования аннотаций безопасности (package javax.annotation.security) для ограничения доступа к ресурсам необходимо зарегистрироваться RolesAllowedDynamicFeature.

правка 1

код AuthorizationFilter должно быть также аннотировано с @PreMatching это означает, что фильтр вызывается перед фазой сопоставления (uri - > resource). В противном случае фильтры регистрируются RolesAllowedDynamicFeature (вызывается во время этой фазы) не будет видеть пользовательский SecurityContext.

Изменить 2

Руководство Пользователя-Джерси - авторизация - Защита ресурсов


в реальном приложении, определяя свой собственный ResourceConfig означает, что вы должны редактировать его каждый раз при добавлении нового ресурса (класса).

хороший способ избежать этой проблемы является регистрация RolesAllowedDynamicFeature класс <init-param> до <servlet> в своем web.xml такой:

<servlet>
    <servlet-name>your_servelet_name</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
    </init-param>

если вы это сделаете, вы можете поместить это в динамическую регистрацию всех ресурсов в определенных пакетах:

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.your-domain.your-packages-1,com.your-domain.your-packages-2</param-value>
    </init-param>