7

我正在尝试使用到目前为止似乎有效的 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
  }
}

资源方法如下所示:

  @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");
  }

RolesAllowedDynamicFeature 注册如下:

.register(RolesAllowedDynamicFeature.class)

我可以在控制台上看到预期的输出。但是如果我取消注释@RolesAllowed("user"),我会收到一个Forbidden错误,并且isUserInRole我的 SecurityContext 的方法永远不会被调用。按照API 文档RolesAllowedDynamicFeature 应该调用此方法。

如何使用 RolesAllowedDynamicFeature?

4

2 回答 2

19

您需要为您的身份验证过滤器定义优先级,否则RolesAllowedRequestFilterinRolesAllowedDynamicFeature将在您的AuthenticationFilter. 如果您查看源代码,RolesAllowedRequestFilter有注释@Priority(Priorities.AUTHORIZATION),因此如果您分配@Priority(Priorities.AUTHENTICATION)给您的身份验证过滤器,它将在RolesAllowedRequestFilter. 像这样:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

您可能还需要实际注册AuthenticationFilterusing register(AuthenticationFilter.class),具体取决于您的服务器是否扫描注释。

于 2013-06-14T15:18:45.090 回答
1

我想是因为

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

其中指出,用户没有必要的角色 @RolesAllowed("user") 甚至进入注释方法的执行。

您应该实现一个更复杂的 isUserInRole 方法来检查用户是否具有特定角色:)

问候

于 2013-06-13T10:12:14.627 回答