dea*_*mon 7 java authentication authorization jax-rs jersey
我正在尝试使用JAX-RS过滤器对用户进行身份验证.这是我正在设置新SecurityContext的过滤器:
@Provider
public class AuthenticationFilter implements ContainerRequestFilter {
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return new Principal() {
@Override
public String getName() {
return "Joe";
}
};
}
@Override
public boolean isUserInRole(String string) {
return false;
}
@Override
public boolean isSecure() {
return requestContext.getSecurityContext().isSecure();
}
@Override
public String getAuthenticationScheme() {
return requestContext.getSecurityContext().getAuthenticationScheme();
}
});
if (!isAuthenticated(requestContext)) {
requestContext.abortWith(
Response.status(Status.UNAUTHORIZED)
.header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Example\"")
.entity("Login required.").build());
}
}
private boolean isAuthenticated(final ContainerRequestContext requestContext) {
return requestContext.getHeaderString("authorization") != null; // simplified
}
}
Run Code Online (Sandbox Code Playgroud)
资源方法如下所示:
@GET
// @RolesAllowed("user")
public Viewable get(@Context SecurityContext context) {
System.out.println(context.getUserPrincipal().getName());
System.out.println(context.isUserInRole("user"));
return new Viewable("index");
}
Run Code Online (Sandbox Code Playgroud)
RolesAllowedDynamicFeature的注册方式如下:
.register(RolesAllowedDynamicFeature.class)
Run Code Online (Sandbox Code Playgroud)
我可以在控制台上看到预期的输出.但如果我取消注释@RolesAllowed("user"),我会收到一个Forbidden错误isUserInRole,我的SecurityContext 的方法永远不会被调用.遵循API文档 RolesAllowedDynamicFeature应该调用此方法.
我如何使用RolesAllowedDynamicFeature?
jos*_*son 15
您需要为身份验证过滤器定义优先级,否则将RolesAllowedRequestFilter在您的身份验证过滤器RolesAllowedDynamicFeature之前执行AuthenticationFilter.如果您查看源代码,则RolesAllowedRequestFilter具有注释@Priority(Priorities.AUTHORIZATION),因此如果您分配@Priority(Priorities.AUTHENTICATION)给您的身份验证过滤器,它将在之前执行RolesAllowedRequestFilter.像这样:
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
Run Code Online (Sandbox Code Playgroud)
您可能还需要实际注册AuthenticationFilter使用register(AuthenticationFilter.class),具体取决于您的服务器是否扫描注释.
我想这是因为
@Override
public boolean isUserInRole(String string) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
其中指出,用户没有所需的角色 @RolesAllowed("user") 甚至无法进入带注释的方法的执行。
您应该实现一个更复杂的 isUserInRole 方法来检查用户是否具有特定角色:)
问候
| 归档时间: |
|
| 查看次数: |
9576 次 |
| 最近记录: |