2011-11-09 33 views
0

@Controllerクラスをpointcutで保護することはできますか?私は試しました:Spring Security/AspectJのポイントカット

<global-method-security pre-post-annotations="enabled"> 
    <!-- Block anything ending with the word 'Controller'--> 
    <protect-pointcut expression="execution(* my.pkg.*Controller.*(..))" access="NON_EXISTANT_ROLE"/> 
</global-method-security> 

理論上、私は決してコントローラにヒットする必要はありません。なぜなら、その役割はどのユーザーにも存在しないからです。しかし、コントローラは正常に動作します。

+0

使用しているスプリングセキュリティのバージョンはどれですか? – Ritesh

+0

バージョン3.0.7を使用しています – user973479

+0

3.0.5より前にこの問題がありました。また、グローバルメソッドセキュリティがコントローラのコンテキストに存在することを確認してください。 – Ritesh

答えて

0

Spring Security FAQ(emphasis mine)を参照してください。春のWebアプリケーション、ディスパッチャサーブレットの スプリングMVC豆を保持するアプリケーションのコンテキストにおいて

しばしば メインアプリケーションコンテキストから分離されます。 myapp-servlet.xmlというファイルで定義されることがよく、myappはweb.xmlのSpring DispatcherServletに割り当てられた名前です。アプリケーションには複数のDispatcherServletsを持つことができ、それぞれ独自の分離されたアプリケーションコンテキストがあります。 これらの「子」コンテキストのBeanは、 アプリケーションの残りの部分には表示されません。 "親"アプリケーションコンテキストは、web.xmlで定義した ContextLoaderListenerによってロードされ、子コンテキストのすべて に表示されます。この親コンテキストは通常​​、 要素を含む のセキュリティ構成を定義する場所です。結果として、 のメソッドに適用されるセキュリティ制約は適用されません。なぜなら、BeanはDispatcherServletコンテキストの には見えないからです。 宣言をWebコンテキストに移動するか、セキュアにしたいBeanをメインアプリケーションコンテキストに移動する必要があります。

通常、個々のWebコントローラではなくサービス レイヤでメソッドセキュリティを適用することをお勧めします。

あなたはサービス層にポイントカットを適用する場合は、あなたのアプリケーションのセキュリティコンテキストで<global-method-security>を設定する必要があります。

関連する問題