本格派エンジニアの工具箱

第22回 Apache Shiroを利用してWebアプリケーションに認証機構を組み込む

この記事を読むのに必要な時間:およそ 6 分

Webアプリケーションへのインテグレーション

前々回に引き続いて,Javaアプリケーション向けの認証フレームワークApache Shiro⁠以下Shiro)の使い方を解説します。ShiroはServletによるWebアプリケーションに組み込んで利用することもできます。Shiroを利用することでWebサイトへのログイン管理が簡単になる他,ページごとに認証方法を変えるなどといった細かな設定も容易に行えるようになります。

ShiroとWebアプリとの連携はServletフィルタの機構を利用して行います。Shiroにはjavax.servlet.Filterインターフェースを実装した基底クラスorg.apache.shiro.web.servlet.AbstractFilterと,これを継承したさまざまなクラスが用意されています。Webアプリ側では,クライアントからのリクエストがこれらのフィルタを経由するようweb.xmlに設定を追加するだけで,Shiroによる認証機構を利用できるようになります。

web.xmlの設定は次のように記述します(ただし,次期バージョンのShiro 1.2からは記述方法が少し変わります。詳細はリファレンスマニュアルを参照してください)⁠IniShiroFilterはShiroの設定をINIファイルから読み込むフィルタです。この例では,設定ファイルshiro.iniを/WEB-INF/ディレクトリに配置し,それを読み込むようになっています。

<filter>
  <filter-name>ShiroFilter</filter-name>
  <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
  <init-param>
    <param-name>configPath</param-name>
    <param-value>/WEB-INF/shiro.ini</param-value> 
  </init-param>
</filter>

その他に,Shiroの設定を直接web.xmlに記述してしまう方法もあります。その場合はinit-paramのparam-nameを「config」として,設定内容をparam-valueの値として直接書き込みます。

<filter>
  <filter-name>ShiroFilter</filter-name>
  <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
  <init-param>
    <param-name>config</param-name>
    <param-value>
      [main]
      ……
      [urls]
      /index.jsp = anon
      ……
      [users]
      gihyo = gihyopass
    </param-value>
  </init-param>
</filter>

INIファイルの書き方は,基本的にはスタンドアロンの場合と同様です。ただし,Webアプリで利用する場合にはここにページごとに使用する認証フィルタの設定を記述しておく必要があります。ページごとの認証フィルタの設定は[urls]セクションに記述します。形式は「⁠コンテキストルートパス】=【フィルタの種類】⁠です。パスにはワイルドカードとして「**」を使うこともできます。たとえば「/user/**」と記述した場合には,/user/ディレクトリ以下のすべてのコンテンツへのアクセスが対象となります。

認証フィルタには下表のようなものがあります。その他に,Shiro 1.2からはログアウト処理を行う「logout」やセッションを作成しない「noSessionCreation」などが利用できるようになる予定です。複数の認証フィルタを適用することも可能で,その場合にはINIファイルの設定でフィルタ名をコンマで区切って記述します。

 認証フィルタの種類

フィルタ名内容使用されるクラス名(パッケージ名は省略)
anon認証を行わない。AnonymousFilter
authcフォームを使ったログイン認証を行う。認証されていないアクセスはログインページへリダイレクトするFormAuthenticationFilter
authcBasicHTTPのBasic認証を行う。BasicHttpAuthenticationFilter
permsログイン中のユーザからのコンテンツごとのアクセス権を制御するPermissionsAuthorizationFilter
port特定のポートへのリクエストのみ許可する。PortFilter
restHTTPリクエスト別にアクセス制御を行う。RESTサービスなどの実装に利用するHttpMethodPermissionFilter
rolesロール別のアクセス権を制御するRolesAuthorizationFilter
sslSSLによる認証を行うSslFilter
user既知のユーザ(認証済みか,またはRememberMe機構によって記憶されたユーザ)からのアクセスのみ許可するUserFilter

認証フィルタもServletフィルタの一種です。たとえば「authc」を指定されているページへのアクセスではFormAuthenticationFilterが使われます。つまりクライアントからのアクセスは最初にweb.xmlに設定されたフィルタを通じてアクセスするページごとの認証フィルタに振り分けられることで,Shiroの認証機構の管理下に置かれるというわけです。

以下に,設定ファイルshiro.iniの記述例を示します。この例では,コンテキストルートのindex.jspとlogin.jspは「anon」が指定しされているので認証なしでアクセスできますが,userディレクトリ以下のコンテンツにアクセスした場合には,⁠authc」フィルタによる認証が必要となります。authcは認証済みのユーザ以外からのアクセスのみ受け付け,それ以外はログインページにリダイレクトします。ログインページは[filters]セクションのauthc.loginUrlプロパティに設定します。[users]セクションにはこれまで同様,ユーザ名とパスワードを記述してあります。

;[main]
;securityManager.sessionManager.sessionValidationSchedulerEnabled = false

;sessionListener = jp.gihyo.toolbox.shiro.MySessionListener
;securityManager.sessionManager.sessionListeners = $sessionListener
[filters]
authc.loginUrl = /login.jsp

[urls]
/index.jsp = anon
/login.jsp = anon
/user/** = authc

[users]
gihyo = gihyopass

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書

コメント

コメントの記入