Dropwizard 身份验证过滤器 @permitall 注释在 class 级别上不起作用
Dropwizard auth filter @permitall annotation does not work on class level
我使用 Dropwizard 0.9.1 创建了一个自定义 AuthFilter 来检查会话 cookie,如下所示:
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);
问题是我无法在资源 classes 的 class 级别上使用 @Permitall 注释。它工作正常如果我使用 on 方法,但不过滤 class.
资源class:
@Path("/")
@PermitAll //Doesn't work here
@Produces(MediaType.APPLICATION_JSON)
public class HomeResource {
@GET
@PermitAll //Works fine if here
@Path("/about")
public Response get() {
}
}
有人知道吗?
DW 9.x 不支持 class 级别的 Authz 注释。在AuthDynamicFeature
的源码中可以看到,只检查了方法级别的注解,最终只将auth过滤器注册到有Authz注解的方法上。
此限制已在 this pull request (to 1.0.0) 中修复,其中将支持 class 级别的 @RolesAllowed
和 @PermitAll
。
我使用 Dropwizard 0.9.1 创建了一个自定义 AuthFilter 来检查会话 cookie,如下所示:
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);
问题是我无法在资源 classes 的 class 级别上使用 @Permitall 注释。它工作正常如果我使用 on 方法,但不过滤 class.
资源class:
@Path("/")
@PermitAll //Doesn't work here
@Produces(MediaType.APPLICATION_JSON)
public class HomeResource {
@GET
@PermitAll //Works fine if here
@Path("/about")
public Response get() {
}
}
有人知道吗?
DW 9.x 不支持 class 级别的 Authz 注释。在AuthDynamicFeature
的源码中可以看到,只检查了方法级别的注解,最终只将auth过滤器注册到有Authz注解的方法上。
此限制已在 this pull request (to 1.0.0) 中修复,其中将支持 class 级别的 @RolesAllowed
和 @PermitAll
。