2016-06-07 4 views
0

Использование Dropwizard 0.9.1 Я создал пользовательский AuthFilter, чтобы проверить куки сессии, как показано ниже:Dropwizard аутентификации фильтр @permitall аннотаций не работает на уровне класса

Priority(Priorities.AUTHENTICATION) 
public class SessionAuthFilter extends AuthFilter<String /*session key*/, SessionUser /*principal*/> { 

    private SessionAuthFilter() { 

    } 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
Cookie sessionKey = requestContext.getCookies().get("sessionKey"); 
if (sessionKey != null) { 
    try { 
    Optional<SessionUser> principal = new SessionAuthenticator().authenticate(sessionKey.getValue()); 
    requestContext.setSecurityContext(new SecurityContext() { 
     @Override 
     public Principal getUserPrincipal() { 
     return principal.get(); 
     } 

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

     @Override 
     public boolean isSecure() { 
     return requestContext.getSecurityContext().isSecure(); 
     } 

     @Override 
     public String getAuthenticationScheme() { 
     return SecurityContext.FORM_AUTH; 
     } 
    }); 
    return; 
    } catch (AuthenticationException e) { 
    throw new InternalServerErrorException(e.getMessage(), e); 
    } 
} 
throw new NotAuthorizedException("Please log in!", "realm="+realm); 
} 

И зарегистрировал его, как показано ниже:

environment.jersey().register(new AuthDynamicFeature(new SessionAuthFilter.Builder().setAuthenticator(new 
    SessionAuthenticator()).setRealm("Login").buildAuthFilter())); 
environment.jersey().register(RolesAllowedDynamicFeature.class); 

Проблема: я не могу использовать аннотацию @Permitall на уровне класса в классах ресурсов. Он отлично работает, если я использую метод, но не фильтрую класс.

Класс ресурсов:

@Path("/") 
@PermitAll //Doesn't work here 
@Produces(MediaType.APPLICATION_JSON) 
public class HomeResource { 

    @GET 
    @PermitAll //Works fine if here 
    @Path("/about") 
    public Response get() { 
    } 

}

Любая идея кто?

ответ

0

Аннотации Authz на уровне класса не поддерживаются в DW 9.x. Вы можете видеть в исходном коде AuthDynamicFeature, проверяются только аннотации уровня метода, в конечном счете регистрируя только фильтр auth для методов с аннотациями Authz.

Это ограничение было исправлено в this pull request (to 1.0.0), где @RolesAllowed и @PermitAll на уровне класса будут поддерживаться.

Смежные вопросы