Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RoleAllowed功能和球衣的授权_Java_Authentication_Jersey_Authorization_Jax Rs - Fatal编程技术网

Java RoleAllowed功能和球衣的授权

Java RoleAllowed功能和球衣的授权,java,authentication,jersey,authorization,jax-rs,Java,Authentication,Jersey,Authorization,Jax Rs,我正在尝试使用JAX-RS过滤器对用户进行身份验证,到目前为止,这似乎是可行的。这是我正在设置新SecurityContext的过滤器: @Provider public class AuthenticationFilter implements ContainerRequestFilter { @Override public void filter(final ContainerRequestContext requestContext) throws IOException {

我正在尝试使用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");
  }
RoleSalowedDynamic功能的注册方式如下:

.register(RolesAllowedDynamicFeature.class)
我可以在控制台上看到预期的输出。但是,如果我取消注释
@RolesAllowed(“user”)
,我会得到一个
禁止的
错误,并且永远不会调用我的SecurityContext的
isUserInRole
方法。在RoleSalowedDynamicFeature之后应该调用此方法


如何使用RoleSalowedDynamicFeature?

我想这是因为

 @Override
  public boolean isUserInRole(String string) {
    return false;
  }
表示用户没有所需的角色@RolesAllowed(“用户”)来执行带注释的方法

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


关于

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

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

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

谢谢,您帮我省了一天的时间。我是通过使用寄存器(AuthenticationFilter.class,Priorities.AUTHENTICATION)设置优先级的,但显然这完全被忽略了。使用注释修复了它。