使いやすい認証機構を実現する「Apache Shiro」
今回取り上げる
JDKにはJAAS
- 理解しやすい簡潔なAPI
- 認証・
承認に必要な一通りの機能を包括的にカバー - さまざまな環境に対応するフレキシビリティ
- Webアプリケーションへの組込みとが可能
- 他のフレームワークやアプリケーションとの統合が容易
- 依存関係が少ない
- 設定が容易
Shiroでは、
- 本人認証
(Authentication) - リソースのアクセス権管理
(Authorization) - セッション管理
(Session Management) - キャッシュ管理
(Cache Management)
それぞれ後述するセキュリティマネージャを通して利用できるようになっており、
Apache Shiroのアーキテクチャ
Apache Shiroは大別すると次の3つのパートから構成されます。
- サブジェクト
(Subject) - アプリケーションからShiroのセキュリティ機構にアクセスするための"ビュー"となるオブジェクト
- セキュリティマネージャ
(SecurityManager) - セキュリティのためのさまざまなコンポーネントを提供・
管理する - 認証レルム
(Realm) - さまざまなセキュリティ・
データと橋渡しの役目をもつコネクタ

前述の4つの機能はコンポーネント化されてセキュリティマネージャによって管理されます。認証レルムはセキュリティ・

Apache Shiroでユーザ認証を行う
Shiroはこのページよりダウンロードできます。全機能を含むバイナリは
今回はshiro-all
Shiroを使った認証の起点となるのはSecurityUtilsクラスです。このクラスのstaticメソッドによって、
今回は、
Factory<org.apache.shiro.mgt.SecurityManager> factory =
new IniSecurityManagerFactory("shiro.ini");
org.apache.shiro.mgt.SecurityManager manager = factory.getInstance();
SecurityManagerが作成できたら、
SecurityUtils.setSecurityManager(manager);
サブジェクトはSubjectクラスとして実装されています。これを取得するには、
Subject user = SecurityUtils.getSubject();
ユーザ認証はSubjectを介して行うことができるのですが、
UsernamePasswordToken token =
new UsernamePasswordToken("gihyo", "gihyopass");
このTokenオブジェクトをSubjectのlogin()メソッドに渡して実行することでログイン認証が行われます。次のプログラムは、
public class FirstShiroSample {
public static void main(String[] args) {
// セキュリティマネージャの設定
Factory<org.apache.shiro.mgt.SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");
org.apache.shiro.mgt.SecurityManager manager = factory.getInstance();
SecurityUtils.setSecurityManager(manager);
// Subjectの取得
Subject user = SecurityUtils.getSubject();
if (!user.isAuthenticated()) {
try {
// Tokenの作成
UsernamePasswordToken token = new UsernamePasswordToken("gihyo", "gihyopass");
// ログイン
user.login(token);
System.out.println("Login successful.");
} catch (AuthenticationException ex) {
System.out.println("Authentication failed.\n" + ex);
}
} else {
System.out.println("This user is authenticated.");
}
}
}
login()メソッドは認証に失敗するとAuthenticationException
.iniファイルの記述方法ですが、
[users]
gihyo = gihyopass
.iniファイルが用意できたら、
Authentication failed.
org.apache.shiro.authc.IncorrectCredentialsException:
The credentials provided for account
[org.apache.shiro.authc.UsernamePasswordToken - gihyo, rememberMe=false]
did not match the expected credentials.
もし
[main]
securityManager.sessionManager.sessionValidationSchedulerEnabled = false
次回は、