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>