今回から2回にわたって,Spring Securityについて取り上げます。Spring Securityは,Springのサブプロジェクトの一つです。以前までAcegi Securityと呼ばれていたセキュリティに関するフレームワークです。この連載を読んでいただいている方なら,名前くらいは聞いたことがあるのではないでしょうか? しかし,Spring Securityを利用すると,どんなセキュリティ対策ができるのかは,あまり知られていないように感じます。
本稿では,まずSpring Securityを利用すると具体的に何ができるのか,また,反対に何ができないのかについて説明します。Spring Securityについて理解したところで,簡単なサンプルの作成を通して,Spring Securityの具体的な使い方を説明します。
Spring Securityで何ができるのか?
Spring Securityを利用すると,以下の2つの機能を簡単に実現することができます。どちらもWebアプリケーションでは,必須の機能です。
- 正規のユーザーであるか確認する機能(認証機能)
- ユーザー毎にアクセスを制御する機能(認可機能)
Spring Securityで実現できる一般的な認証機能は,図1のようになります。

ユーザーがブラウザからログイン画面にアクセスし,ユーザIDとパスワードを入力します(1)。Webアプリケーションは,入力された情報を基にユーザー情報を管理しているDBなどに問い合わせ,取得します(2),(3)。正規のユーザーであれば,認証済みのユーザー用の画面を表示します。不正なユーザーであれば,エラー画面やログイン画面をエラー・メッセージとともに表示します。
また,認証機能があったとしても,未認証のユーザーがブラウザのアドレスバーから直接URLを入力した場合に,未認証ユーザーに画面を表示してしまっては元も子もありません。その為,緑色の矢印のように未認証ユーザーによる直接アクセスを防ぐ必要があります。未認証ユーザーによる直接アクセス禁止は,Spring Securityを利用すると簡単に実現することができます。
Spring Securityで実現できる一般的な認証機能は以上の通りです。後述しますが,認証機能にはユーザー情報の保存場所やセキュリティレベルなどの要件により様々な方法が考えられます。Spring Securityでは,たくさんの種類の認証機能に対応しているので,様々な案件に対して適応することができます。
続いて,Spring Securityで実現できる一般的な認可機能は,図2のようになります。

一般ユーザーがログインを行うと一般ユーザー向けのコンテンツのみが表示されて管理ユーザー向けのコンテンツを閲覧することができません(青矢印)。管理ユーザーがログインを行うと,一般ユーザーコンテンツと管理ユーザーコンテンツの両方を閲覧することができます(緑矢印)。
Spring Securityの認可機能を利用すると,ユーザー毎に閲覧できる画面を簡単に制限することができます。
利用者は何をする必要があるか?
ここまででSpring Securityを利用すると認証機能と認可機能が実現できると述べました。ですがここまでの説明では,Spring Securityを利用した場合,結局何が楽になるかまだわからないと思います。
Spring Securityを使用した場合の認証処理に関してざっくりと言うと,サーバーサイドでの処理の実装量を少なくすることができます。もう少し具体的に言うと,JSPなどから決められたURLにアクセスすると自動的にログイン処理(ユーザー情報の取得,正規のユーザーであるかの判定など)をSpring Securityが行ってくれます。
Spring Securityでは,認証チェックを行うURLやログイン画面,エラー時の遷移先情報などはbean定義ファイルに記述します。bean定義ファイルと聞いて,またたくさん設定ファイルを書かなければいけないの?と毛嫌いする方もいるかもしれませんが,Spring Securityでは独自のXMLスキーマを用意することで,設定ファイルを簡潔に記述できるようになっていますのでご安心ください。
Spring Securityを使用した場合,認可機能に関してはJSP用のカスタムタグが用意されているため,そのカスタムタグでユーザーの権限毎に簡単にアクセス制限を行うことができます。原則として,認証機能と併せて利用する必要があります。
これまでは,プロジェクト毎に同じようなログイン処理やユーザー毎のアクセス制限機能を実装する必要がありました。画面遷移やDI,AOPなどだけでなく,認証・認可処理に関しても同じような処理は,できるだけフレームワークに任せましょうというのが,Spring Securityです。
利用した際のイメージがまだわかないという方は,後述するサンプル・プログラムの作成を読んでいただくと理解が深まると思います。