/**
* LoginModuleの実装クラスは,LoginModuleインタフェースを継承して作成します。
*
*/
public class ExampleLoginModule implements LoginModule
{
// initialize()メソッドに渡ってきたパラメタの値を各メソッドで参照するために使用されます。
private Subject subject;
private CallbackHandler callbackHandler;
private Map sharedState;
private Map options;
// sharedStateからユーザIDおよびパスワードの値を取り出すときの名称を定義します。
// “simple.login.username”, "simple.login.password";は,統合ユーザ管理のコンフィグレーションファイルで
// 指定できます。
private static final String USERNAME = "simple.login.username";
private static final String PASSWORD = "simple.login.password";
// 認証の判定をするユーザIDを格納します。この値は,login()で設定され,commit()で参照されます。
private String username;
// login()の正否を格納します。trueなら,login()が成功しており,falseならlogin()が失敗しています。
// この値は,login()で設定されcommit()で参照されます。 private boolean succeeded;
// commit()の正否を格納します。trueなら,commit()が成功しており,falseならcommit()が失敗しています。
// この値は,commit ()で設定されabort ()で参照されます。 private boolean commitSucceeded;
/**
* initialize()メソッドでは,引数に渡ってきたパラメタをメンバ変数に覚えます。
* また,これ以外に初期化が必要な処理があればそれを行います。
* (本クラスインスタンス時に1回だけ呼ばれる)
*
*/
public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options)
{
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
}
/**
* login ()メソッドでは,認証に必要なユーザIDの取得と認証処理を行います。
* 本例では,認証に成功した場合succeededにtrueを設定します。また,usernameに認証したユーザID
* を格納します。
*
*/
public boolean login()
throws LoginException
{
// SSOに対応するには,最初にsharedState内にユーザID・パスワードを取り出します。
this.username = (String)this.sharedState.get(USERNAME);
String password = (String)this.sharedState.get(PASSWORD);
// sharedState内にユーザIDがない場合,CallbackHandlerを使ってユーザID/パスワードの
// 取り出しを行います。(この例では,WebPasswordCallbackに値を設定してくれる,WebPasswordHandlerが
// が前提になります)
if (this.username == null || this.username.length() == 0) {
WebPasswordCallback webpc = new WebPasswordCallback();
webpc.setOption(WebPasswordCallback.GETPW);
Callback callbacks[] = new Callback[] { webpc };
try {
this.callbackHandler.handle(callbacks);
}
catch (Exception ex) {
// 例外処理を行います。
}
// CallbackからユーザIDとパスワードを取り出します。
this.username = webpc.getName();
password = webpc.getPassword();
}
// 認証で使用するユーザIDの有無を調べます。もし,ユーザIDがない場合は,例外を上げます。
if (this.username == null || this.username.length() == 0) {
throw new FailedLoginException();
}
// 各アプリケーションの認証処理を行います。
// 認証した結果,問題がなければsucceededにtrueを設定します。
/* ここに認証処理を入れる。 */
if (!succeeded) {
throw new FailedLoginException();
}
return succeeded;
}
/**
* commit ()メソッドでは,認証したことを示すために,PrincipalオブジェクトをSubjectに関連づけます。
* (SimplePrincipalは,PrincipalとSerializableのインタフェースを継承して作成されたクラスです。
*
*/
public boolean commit()
throws LoginException
{
// PrincipalオブジェクトをSubjectに関連づけます。これにより,統合ユーザ管理で管理している
// ログインセッション管理に参加したり,SSOの機能に対応することができます。
this.subject.getPrincipals().add( new SimplePrincipal(this.username) );
/* ユーザ属性があるなら,それもSubjectに関連づける処理を入れる。 */
return this.commitSucceeded = true;
}
/**
* abort ()メソッドでは,login()メソッドcommit()メソッドで障害があった場合にリカバリするために
* 呼び出されます。
*
*/
public boolean abort()
throws LoginException
{
if (this.commitSucceeded) {
// Subjectに関連づけているPrincipalやユーザ属性を解放します。
// この例ではlogout()メソッドを呼び出して解放します。
logout();
}
return true;
}
/**
* logout ()メソッドでは,ログアウトする場合に呼び出されます。
* このメソッドでは,Subjectに関連づけられているPrincipalやユーザ属性を解放するために使用されます。
*
*
*/
public boolean logout()
throws LoginException
{
// SubjectからPrincipalやユーザ属性を削除する処理を入れます。
return true;
}
} |