SSOクライアントの作成(4)リクエスト毎にSSOが有効か否かをチェックする

2008/11/21:この記事にあるOpenSSOはかなり古いものです。最近のものを使う際の参考にはならないかもしれませんのでご注意ください。

リクエスト毎にSSOクライアントとSSOの認証が済んでいるか否かをチェックする。
今回は以下のような実装になっている。

  • SSOクライアント未認証 SSO未認証
    • エラー(1)
  • SSOクライアント認証済 SSO未認証
    • エラー(2)
  • SSOクライアント未認証 SSO認証済
    • SSOクライアントでパスワードなし認証(=ユーザの存在チェック)
      • SSOクライアントで認証OK
        • SSOクライアントを認証済にしてSSOセッションをリフレッシュして正常系へ(3-1)
      • SSOクライアントで認証NG
        • エラー(3-2)
  • SSOクライアント認証済 SSO認証済
    • SSOセッションをリフレッシュして正常系へ(4)
// SSOクライアントとSSOで認証済ならtrue、それ以外はfalseを返す
public boolean isValidLoginStatus() {
	try {
		SSOTokenManager ssoManager = SSOTokenManager.getInstance(); 
		SSOToken ssoToken = ssoManager.createSSOToken(SSOUtils.getSSOTokenIdFromCookie()); 
		if (isValidLoginForLocalApp()) {
			// このアプリケーションで未ログインの場合は
			// SSOでログインチェックを行う。
			if(ssoManager.isValidToken(ssoToken)) {
				// SSOでログイン済みの場合はこのアプリケーションでも
				// ログイン済みにしてから正常系で返す。
				if(login4validsso(ssoToken.getProperty("UserId"))) {
					// SSOでログインしていたのでこのアプリでもログインした
					ssoManager.refreshSession(ssoToken);
					return true; // (3-1)
				} else {
					// SSOでログインしているがこのアプリのユーザではない
					return false; // (3-2)
				}
			} else {
				// このアプリでもSSOでも未ログイン
				return false; // (1)
			}
		}
		// このアプリでログイン済み
		// ログイン済みの場合でもidle時間を0にするために
		// SSOサーバーにアクセスする。
		ssoManager.refreshSession(ssoToken); 
		return true; // (4)
	} catch (SSOException e) {
		LOG.error("Validation fail.", e);
		return false; // (2)
	} 
}
public boolean isValidLoginForLocalApp() {
	// SSOクライアント自体が認証済か否かチェックし、
	// 認証済であればtrue、そうでなければfalseを返す
	... 略 ...
}
public void login4validsso(String id) {
	// 前述のlogin()とほぼ同じ動作。
	// ただし、SSOクライアントに対するパスワード認証がないのと
	// SSO認証はしない(もう認証済)ところが異なる。
	... 略 ...
}

と、いうことでおよその実装が完了。
ただし、全般的にテストコードなので注意。


一段落。
でも、自分のところの要件ではPHPでも対応する必要があるんだな。これが。
OpenSSO Extensionに「SAML 2.0 PHP Relying Party(旧lightbulb)」があるのだけれど、PHP5用っぽいんだよねぇ。