Spring security と Spring MVC で global-method-security

Spring MVC の controller に global-method-securityアノテーションベースのアクセス制御をかけようとしてハマったのでメモ。環境は Spring security と Spring MVC ともに 3.0.5-RELEASE 。

結論からいうと web.xml で DispatcherServlet で読み込む MVC 用の xml 設定ファイル*1global-method-security の指定をしないと効かない。

最初 web.xmlcontext-param に他の applicationContext と同列に Spring security 用の xml を作成してそこに global-method-security を定義してたんだけど、 controller 以外のクラスに @Secured を指定した場合は効くのに controller に指定した場合だけ効かない。

色々ぐぐってみた結果どうも設定の読み込み順とかの問題らしく、 servlet から参照する設定ファイルに定義すりゃいけるみたいな話があったので試したらいけた。でもセキュリティ関連の設定は分けときたい気もするし、もうちょいスマートなやり方がありそう。なおこの場合 cglib が必要なので注意。

てか全然仕組みを理解してないのが問題だな。ソースもドキュメントも全然読めてないし・・。

それにしても Spring MVC も security も日本語情報少ないなー。やはり日本では人気無いのかしら。さっさと Struts から抜け出して Spring MVC を布教したいけど道のりは長そうだ。

*1:Spring MVC のサンプルでは mvc-config.xml とかそんな名前のやつ