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 doc RolesAllowedDynamicFeatureに従って、このメソッドを呼び出す必要があります。

RolesAllowedDynamicFeature はどのように使用できますか?

4

2 に答える 2

19

認証フィルターの優先順位を定義する必要があります。そうしないと、 RolesAllowedRequestFilterinが. ソースコードを見ると、にアノテーションが付いているので、認証フィルターに割り当てると の前に実行されます。このような:RolesAllowedDynamicFeatureAuthenticationFilterRolesAllowedRequestFilter@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 に答える