2012-03-06 4 views
4

ContainerRequestFilterインターフェイスでフィルタを作成し、ユーザーエンティティを返すカスタムロールを割り当てようとしました。ContainerRequestFilterを使用してJersey WebServiceのカスタム@RolesAllowedロール

@Override 
public ContainerRequest filter(ContainerRequest request) { 
    User user = authenticate(request); 
    if (user != null) { 
     request.setSecurityContext(new Authorizer(user)); 
    } else { 
     throw new WebApplicationException(400); 
    } 
    return request; 

} 

private User authenticate(ContainerRequest request) { 

    user = new User("erhan", "customRole"); 


    return user; 
} 

public class Authorizer implements SecurityContext { 

    private User user; 
    private Principal principal; 

    public Authorizer(final User user) { 
     this.user = user; 
     this.principal = new Principal() { 

      public String getName() { 
       return user.username; 
      } 
     }; 
    } 

    public Principal getUserPrincipal() { 
     return this.principal; 
    } 

    public boolean isUserInRole(String role) { 
     return (role.equals(user.role)); 
    } 

    public boolean isSecure() { 
     return "https".equals(uriInfo.getRequestUri().getScheme()); 
    } 

    public String getAuthenticationScheme() { 
     return SecurityContext.BASIC_AUTH; 
    } 
} 

public class User { 

    public String username; 
    public String role; 

    public User(String username, String role) { 
     this.username = username; 
     this.role = role; 
    } 
} 

すべては、そのフィルタで結構ですが、それは、Webサービス

@GET 
@RolesAllowed({"customRole"}) 
@Path("/test") 
public String getByType(@Context HttpHeaders headers,@Context SecurityContext sc, 
           @Context HttpServletRequest request) { 



    return null; 
} 

に行くときには、Webサービスに達したが、私は役割を変更するとき、まだ同じWebサービスに達しました。ジャージーではどのように異なるカスタムロールを提供できますか?

+4

[OK]を使用する必要がありますちょうど ​​com.sun.jersey.spi.container.ResourceFiltersを追加する別の方法 する必要があります com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactoryは私のweb.xmlの解決の問題へ フィルタ。しかし、なぜ私はContainerRequestFilters以外のフィルタを初期化する必要がありますか? – erhan

+2

Jerseyは@RolesAllowedをそのまま使用できないため、前述のフィルタはこのサポートを追加します。そしてBTW、あなたは不正なために400を返すべきではない、それは悪い要求を意味する。 HTTPステータス401を参照してください。 –

答えて

2

ジャージー2を使用すると、RolesAllowedDynamicFeatureを登録し、web.xmlでアプリケーションを保護することができます。カスタムSecurityContextの実装は必要ありません。

詳細については、Jersey custom SecurityContext on EJB jax-rs resourceを参照してください。

0

注釈をクラスに配置してみます。 私のために@PreMatching@Providerで追加しています。 この場合、プロバイダ注釈は必須と思われます。

@PreMatching 
@Provider 
public class RequestFilter implements ContainerRequestFilter { 
    ..... 
} 

これは、これを追加しようと動作しない場合: @priority(Priorities.AUTHORIZATION)さらに

あなたが役割を可能にし、register RolesAllowedDynamicFeatureまたは私は解決策を見つけたと思うalternatives - check example 19.2

関連する問題