2013-06-12 27 views
5

JAX-RSフィルタを使用してユーザーを認証しようとしています。これは私が新しいSecurityContextが設定していますフィルタです:RolesAllowedDynamicFeatureとJerseyを使用した認証

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

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

答えて

1

は、私はそれは、ユーザーが必要な役割をしても、注釈付きメソッドの実行を入力する(「ユーザー」)@RolesAllowedていないことを、述べための

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

だと思います。

あなたは、ユーザーが特定の役割を持っているかいないwheterチェックは、あなたの認証フィルタの優先順位を定義する必要が

よろしく

13

、そうでない場合はRolesAllowedRequestFilterで:)をすることをより洗練されたのisUserInRoleメソッドを実装する必要がありますAuthenticationFilterの前にRolesAllowedDynamicFeatureが実行されます。ソースコードを見ると、RolesAllowedRequestFilterには@Priority(Priorities.AUTHORIZATION)の注釈が付いているので、@Priority(Priorities.AUTHENTICATION)を認証フィルタに割り当てると、RolesAllowedRequestFilterの前に実行されます。このように:

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

また、あなたのサーバーのスキャン注釈のか、いない場合に応じて、実際にregister(AuthenticationFilter.class)を使用してAuthenticationFilterを登録する必要があります。

+1

ありがとうございました。私はレジスタ(AuthenticationFilter.class、Priorities.AUTHENTICATION)を使用して優先順位を設定していましたが、明らかに何とかそれは完全に無視されました。注釈を使用して固定しました。 – emas

+0

あなたも私の一日を保存しました! – Manish

関連する問題