LoginSignup
14
15

More than 5 years have passed since last update.

目的

DBを使ったユーザ認証・権限管理をWebアプリケーションで行いたい。Apache Shiroでおこなうことを想定した場合、どのように実施するかを明確にすること。

注意

やや古い情報を元に書き写しているので、動作確認を実際にする必要があります。

Apache Shiroの環境準備

pom.xmlに以下を追加して、Mavenを利用する。

pom.xml
<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ファイルとして記述する。ファイル名は変更可能。

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設定をおこないます。

web.xml
<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認証

shiro.ini
[urls]
/mnt/** = authcBasic,roles[admin]

この例では、Basic認証で/mntの下のアクセスは、認証したユーザのroleがadminでないとアクセスできないことを表しています。

Form認証

shiro.ini
[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 です。
そのため、

shiro.ini
credentialsMatcher = org.apache.shiro.authc.credential.Sha1CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = true
jdbcRealm.credentialsMatcher = $credentialsMatcher

と設定することで、対応できます。

14
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15