2016-05-12 5 views
0

Spring Security @PreAuthorizeアノテーションを使用して、JerseyベースのREST APIの適切なロールと権限を確認しています。私たちが心配しているのは、何らかの方法でアノテーションを忘れてしまい、それを無防備にしてしまうことです。@PreAuthorizeが確実に定義されていますか?

@PreAuthorize("permitAll")(たとえすべてを明示的に許可しています)でも、すべてのAPIに注釈が付いていることを確認する方法はありますか?

APIがアノテーションを使用しない場合、要求がブロックされ(APIが使用できないように)、エラーがログに記録される(つまり、間違いがすぐにわかるように)ことを想定しています。

1つの方法は、要求を「安全」とマークする要求属性を追加するカスタム式を作成することです。次に、Webフィルタはリクエスト属性が適切であるかどうかをチェックし、そうでない場合はエラーをログに記録します。

これを行うにはクリーナーの方法はありますか?例えば、注釈なしのメソッドのデフォルトポリシーとして"denyAll"を設定し、それを適切にオーバーライドする必要がありますか?

答えて

0

私は最終的には、各メソッドやクラスは、注釈を持っていることを確認ジャージーResourceFilterFactoryを追加することで、これを解決:

public class RestFilterFactory implements ResourceFilterFactory { 
    private static final Logger log = LoggerFactory.getLogger(RestFilterFactory.class); 

    @Override 
    public List<ResourceFilter> create(AbstractMethod method) { 
     ensurePreAuthorizedAnnotation(method); 
     return Arrays.emptyList(); 
    } 

    private void ensurePreAuthorizedAnnotation(AbstractMethod method) { 
     boolean found = false; 
     if (hasPreAuthenticatedAnnotation(method)) { 
      found = true; 
     } 
     if (hasPreAuthenticatedAnnotation(method.getResource().getResourceClass())) { 
      found = true; 
     } 
     if (!found) { 
      log.error("Resource is not protected with @PreAuthorize annotation: " + method); 
     } 
    } 

    private boolean hasPreAuthenticatedAnnotation(AnnotatedElement element) { 
     Annotation a = element.getAnnotation(PreAuthorize.class); 
     return a != null; 
    } 
} 
関連する問題