Apache Shiroのセッション管理機能
前回に引き続き、
Webアプリケーションであればjavax.
Shiroでセッションを扱うにはorg.
// セッションの取得(作成)
Subject user = SecurityUtils.getSubject();
Session session = user.getSession(true);
このメソッドは、
セッションへのキーと値の設定はaddAttribute()メソッドを使います。このメソッドにはキーとなるオブジェクトと、
// セッションにキーと値をセット
session.setAttribute("key", "value");
// セッションから値の取得
String attribute = session.getAttribute("key");
次のコードは、
public class SessionSample {
public static void main(String[] args) {
// セキュリティマネージャの設定
Factory factory =
new IniSecurityManagerFactory("classpath:resources/manager.ini");
SecurityUtils.setSecurityManager(factory.getInstance());
// Subjectの取得
Subject user = SecurityUtils.getSubject();
while(true) {
Session session = null;
if (!user.isAuthenticated()) {
try {
// Tokenの作成
UsernamePasswordToken token =
new UsernamePasswordToken("gihyo", "gihyopass");
// ログイン
user.login(token);
System.out.println("----ログインしました。");
// セッションの取得(作成)
session = user.getSession(true);
// コンソールからの入力値をセッションのプロパティにセット
System.out.println("----任意のテキストを入力してください。");
String input = System.console().readLine();
session.setAttribute("input", input);
} catch (AuthenticationException ex) {
System.out.println("Authentication failed.\n" + ex);
}
} else {
System.out.println("----ログイン中です。");
if ((session = user.getSession(false)) != null) {
System.out.println("前回の入力テキスト: " + session.getAttribute("input"));
// コンソールからの入力をセッショプロパティにセット
// ただし"LOGOUT"だった場合はログアウト処理
System.out.println("----任意のテキストを入力してください。");
String input = System.console().readLine();
if (input.equals("LOGOUT")) {
user.logout();
System.out.println("----ログアウトしました。");
break;
} else {
session.setAttribute("input", input);
}
}
}
}
}
}
このプログラムの実行例は以下のようになります。Sessionオブジェクトを経由して情報が記録できていることが確認できます。
----ログインしました。
----任意のテキストを入力してください。
Hello!
Shiroにおけるセッションは、
とくにEHCacheを利用した実装についてはshiro-ehcacheパッケージ
セッションの開始/終了時にリスナを起動する
Shiroのセッションでは、
public class MySessionListener extends SessionListenerAdapter {
public void onStart(Session session) {
System.out.println("----Session started.");
}
public void onStop(Session session) {
System.out.println("----Session stopped.");
}
}
SessionListenerAdapterクラスはSessionListenerの空の実装です。onStart()はセッションが開始されたときに呼び出されるメソッドです。onStop()はセッションが停止されたとき、
リスナの登録は、
[main]
......
sessionListener = jp.gihyo.toolbox.shiro.MySessionListener
securityManager.sessionManager.sessionListeners = $sessionListener
......
この状態でSessionSampleを実行すると、
----Session started.
----ログインしました。
----任意のテキストを入力してください。
Hello!
なお、
// SessionListenerの登録
DefaultSecurityManager securityManager =
(DefaultSecurityManager)SecurityUtils.getSecurityManager();
DefaultSessionManager sessionManager =
(DefaultSessionManager)securityManager.getSessionManager();
List sessionListeners = new ArrayList();
sessionListeners.add(new MySessionListener());
sessionManager.setSessionListeners(sessionListeners);