【问题标题】:Authorization with RolesAllowedDynamicFeature and Jersey使用 RolesAllowedDynamicFeature 和 Jersey 进行授权
【发布时间】:2013-06-12 14:47:53
【问题描述】:

我正在尝试使用 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 错误,并且我的SecurityContext 的isUserInRole 方法永远不会被调用。在API docRolesAllowedDynamicFeature 之后应该调用这个方法。

如何使用 RolesAllowedDynamicFeature?

【问题讨论】:

    标签: java authentication jersey authorization jax-rs


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,你拯救了我的一天。我通过使用 register(AuthenticationFilter.class, Priorities.AUTHENTICATION) 设置优先级,但显然不知何故被完全忽略了。使用注释修复它。
    【解决方案2】:

    我猜是因为

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

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

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

    问候

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 2013-07-30
      • 2016-09-08
      • 2021-06-05
      • 2010-10-30
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      相关资源
      最近更新 更多