#目的
DBを使ったユーザ認証・権限管理をWebアプリケーションで行いたい。Apache Shiroでおこなうことを想定した場合、どのように実施するかを明確にすること。
注意
やや古い情報を元に書き写しているので、動作確認を実際にする必要があります。
#Apache Shiroの環境準備
pom.xmlに以下を追加して、Mavenを利用する。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.2</version>
</dependency>
#Apache Shiroの設定
Shiroの設定は、shiro.iniファイルとして記述する。ファイル名は変更可能。
[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ?
jdbcRealm.userRolesQuery = SELECT authority FROM user_roles WHERE username = ?
jdbcRealm.permissionsLookupEnabled = false
ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
ds.serverName = localhost
ds.port = 3306
ds.user = ユーザ名
ds.password = パスワード
ds.databaseName = DB名
jdbcRealm.dataSource = $ds
DBへの認証情報の設定
authenticationQuery とuserRolesQuery によって、認証情報をDBからどのように取得するかを設定します。(SQLとして)
注意
この例はパスワードを平文で扱っているので、注意が必要です。別途、下にてハッシュ化したパスワードを取り扱う内容を記述しま
す。
設定ファイルの特徴
shiroファイルはDIコンテナの設定ファイルと同じような意味を持っており、変数名に対してクラスを設定するとインスタンス変数
のように利用できる。jdbcRealmはその例です。その変数をJavaBeanとしてとらえ、propertyに設定することで設定をおこないます
。いくつか予約名を持っており、その名称を利用して設定することで動作を変更することができます。
#Webアプリケーションへの組み込み
Webアプリケーションで利用するためには、web.xmlにShiroFilterを適用する必要があります。
##web.xmlへの設定
以下のようにFilter設定をおこないます。
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
<init-param>
<param-name>configPath</param-name>
<param-value>classpath:shiro.ini</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
この設定では、ClassPathの直下のshiro.iniが読み込まれます。
権限管理の仕方
Webアプリケーションの権限管理として、URLベースの権限管理をおこなうことができます。そのためにはshiro.iniに追記します。
Basic認証とForm認証で動作が異なるため、それぞれを記述します。
Basic認証
[urls]
/mnt/** = authcBasic,roles[admin]
この例では、Basic認証で/mntの下のアクセスは、認証したユーザのroleがadminでないとアクセスできないことを表しています。
Form認証
[urls]
/mnt/** = authc,roles[admin]
[filters]
authc.loginUrl = /login.jsp
設定先のオブジェクト名が、authBasicからauthcに代わります。
これは、authcBasic.authcは予約名で、Basic認証(org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter)、Form認証
(org.apache.shiro.web.filter.authc.FormAuthenticationFilter)をおこなうクラスで定義されています。
パスワードの符号化
パスワードを平文でDBMSに格納することはセキュリティ上、好ましくないため通常はSHA1などのハッシュアルゴリズムで符号化して格納する。
Shiroを使って、パスワードを符号化するための設定は以下の通りです。
パスワード認証を管理しているのがCredenialMatcherで、
SHA1に対応したCredenialMatcherは
Sha1CredentialsMatcher です。
そのため、
credentialsMatcher = org.apache.shiro.authc.credential.Sha1CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = true
jdbcRealm.credentialsMatcher = $credentialsMatcher
と設定することで、対応できます。