アカウント管理にJDBCを使う

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

SSOサーバーの管理画面の「Subjects」でユーザをコツコツいじるのはさすがに辛いので、DB上にあるユーザーを参照することにする。
今回はHSQLDBを参照するように設定してみる。

ちなみにDBレイアウトは以下のような感じ。

CREATE TABLE user (
	id VARCHAR(13),
	type VARCHAR(1),
	groupid VARCHAR(6),
	userid VARCHAR(6),
	name VARCHAR(40),
	password VARCHAR(40),
	deleterid VARCHAR(13),
	modifierid VARCHAR(13),
	tstamp TIMESTAMP,
	PRIMARY KEY (
		id
	)
);
  1. SSOサーバーの管理画面にログインする。
  2. Access Control」タブの「opensso」Realmの「Authentication」タブを開き、「Module Instances」の「New」ボタンを押す。
  3. 「Name」に「test」と入力し、「Type」として「JDBC」を選択して「OK」ボタンを押す。
  4. 「Module Instances」に「test」が追加されているので(追加されてない場合は画面を切り替えると出てくるかも)、「test」をクリックする。
  5. ひとまず以下のように設定して「OK」ボタンを押す。Passwordが未入力だと例外が発生するため、半角スペースを入れてあるところに注意。実際にはPasswordが空でも半角スペースを指定してログインできるらしい。
    • Connection Type:「Non-persistent JDBC connection」
    • Connection Pool JNDI Name:「java:comp/env/jdbc/samplePool」(使わないけどデフォルトのまま)
    • JDBC Driver:「org.hsqldb.jdbcDriver」
    • JDBC URL:「jdbc:hsqldb:hsql://localhost:9001」
    • Connect This User to Database:「sa」
    • Password for Connecting to Database:「 」(半角スペース1つ)
    • Password for Connecting to Database (confirm):「 」(半角スペース1つ)
    • Password Column String:「password」
    • Prepared Statement:「select password from user where id = ?」
    • Class to Transform Password Syntax:「com.sun.identity.authentication.modules.jdbc.ClearTextTransform」(デフォルトのまま)
    • Authentication Level:「0」(デフォルトのまま)


ここまでの設定をすることで、SSOクライアントのAuthContext#loginの第二引数に「test」と指定したときにHSQLDB上の「user」テーブルを見に行くようになる。
ただし、これでもまだSSOサーバーの管理画面の「Subjects」の設定がないとSSO認証されない。
上記に加えて以下の設定が必要になる。

  1. Access Control」タブの「opensso」Realmの「Authentication」タブを開き、「General」の「Advanced Properties」ボタンを押す。
  2. 「Realm Attributes」の「User Profile」で「Ignored」を選択。
  3. 「Realm Attributes」の「Generate UserID Mode」で「Enabled」のチェックを外す。
  4. 「Save」ボタンを押す。


ちなみにこれらの設定がちゃんとできているかどうかの確認はSSOクライアントを使うのではなくopenssosamplesのLogin.classを使うと楽である。
これまで「DataStore」を指定していたところを「test」にすればよい。
なお、DB上に格納されているパスワードが平文でない場合は「Class to Transform Password Syntax」に適切なクラスを指定すればよさそう。