PALポータル(Jetspeed2)とOpenSSO

ここのところ、SSOまわりを調査・検討しているけど、PALポータル(Jetspeed2も同じ)でOpenSSOの認証を使う仕組みを作って、PALにコミットしておいた。OpenSSO もまだ謎の部分が多いのだけど(設定がいろいろあって細かいところを理解するにはもっと時間が必要・・・)、とりあえず、動いた。やり方は、JBoss Portal がやっていることに近い(Liferay のやり方はいまいちな気がする)。コードは以下に置いた(リリース物はそのうち・・・)。

http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/pal-portal/trunk/components/palportal-sso/?root=pal

使い方

  1. OpenSSO をセットアップする
  2. palportal-sso-2.1.3_pal-1.0.3.jar と openssoclientsdk-1.0-b3.jar (openssoclientsdk.jar)を webapps/palportal/WEB-INF/lib/ にコピーする
  3. webapps/palportal/WEB-INF/web.xml を編集する
...
<filter>
<filter-name>OpenSSOFilter</filter-name>
<filter-class>jp.sf.pal.portal.sso.opensso.OpenSSOFilter</filter-class>
<init-param>
<param-name>loginURL</param-name>
<param-value>http://servername:8080/opensso</param-value>
</init-param>
</filter>
...
<filter-mapping>
<filter-name>OpenSSOFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...

注意点

  • ログインしていない状態でアクセスしたい場合は、filter のパラメータでprotectedPathsを指定する。/login/proxy などを指定すると、OpenSSOの認証後にそのページが表示されるので別途サーブレットを用意する必要がある(何か良い方法が思いついたら手を加えるかも)。

JOSSOやCASにしても、同じようにやればいいのだと思うけど、環境を作るのが面倒なので、またそのうち考えよっと。というわけで、Jetspeed2 でもそれらの SSO はできる(と思う)ということで。

ユーザー追加などをバッチ処理する

Jetspeedでユーザーの追加や削除をバッチ処理したいという要望をよく聞いていたのですが、それをするサーブレットをPALポータルに追加してみました(次のリリースでは含まれている予定)。

http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/pal-portal/trunk/portal/files/components/portal/src/java/jp/sf/pal/portal/servlet/UserManagerServlet.java?rev=862&root=pal&view=markup

使い方は、ポータルの web.xml に以下のサーブレット定義を加える(必要に応じて、セキュリティの設定をする)。

<servlet>
<servlet-name>UserManagerServlet</servlet-name>
<servlet-class>jp.sf.pal.portal.servlet.UserManagerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserManagerServlet</servlet-name>
<url-pattern>/userManager</url-pattern>
</servlet-mapping>

あとは http://localhost:8080/palportal/userManager?name1=value1&… にアクセスする。以下の操作が可能である。

  • ユーザーの認証確認
  • ユーザーの追加
  • パスワードの更新
  • ユーザーの削除

出力フォーマットは以下のような感じ。

<?xml version="1.0" encoding="UTF-8" ?>
<results>
<status>文字列</status>
<message>文字列</message>
<result>
<name>文字列</name>
<value>文字列</value>
</result>
</results>

ユーザーの認証確認

URLで渡すパラメータ
リクエストパラメータ
action authenticate
username ユーザー名
password パスワード
出力結果のstatus
説明
success 正常終了(ユーザーが存在して、パスワードも正しい場合)
authentication-failed ユーザー認証に失敗した
invalid-parameter リクエストパラメータが正しくない
excluded-user 操作の対象外ユーザーへの処理を行った

ユーザーの追加

URLで渡すパラメータ
リクエストパラメータ
action create
username ユーザー名
password パスワード
出力結果のstatus
説明
success 正常終了(ユーザーが正常に作成された場合)
user-already-exists ユーザーが既に存在していて、作成できない
server-error ユーザー作成時にサーバー側でエラーが発生した
invalid-parameter リクエストパラメータが正しくない
excluded-user 操作の対象外ユーザーへの処理を行った

パスワードの更新

URLで渡すパラメータ
リクエストパラメータ
action update
username ユーザー名
password パスワード
出力結果のstatus
説明
success 正常終了(ユーザー情報が正常に更新された場合)
user-not-found 対象ユーザーが存在しない
server-error ユーザー更新時にサーバー側でエラーが発生した
invalid-parameter リクエストパラメータが正しくない
excluded-user 操作の対象外ユーザーへの処理を行った

ユーザーの削除

URLで渡すパラメータ
リクエストパラメータ
action update
username ユーザー名
password パスワード
出力結果のstatus
説明
success 正常終了(ユーザーが正常に削除された場合)
user-not-found 対象ユーザーが存在しない
server-error ユーザー削除時にサーバー側でエラーが発生した
invalid-parameter リクエストパラメータが正しくない
excluded-user 操作の対象外ユーザーへの処理を行った

以上。

Preferencesにはまる

J2 では、JavaのPreferencesをベースにSPIを実装して使っていて、ユーザー属性とかデータを保存しているのだけど、そのSPIの中でEhcacheでキャッシュしたりで、複雑・・・。どうも、ehcache.xmlでキャッシュの生存時間が有効にならないなっと思って調べていて、J2->Spring->Ehcache みたい経路で使っていたりで、頭の中がかなり混乱してした。よく見てみると、getSpiの中でEhcacheのキャッシュをチェックしていないのが問題だったみたい。今回、Preferencesまわりもいろいろと見たけど、SPIで使っているAbstractPreferencesの中でキャッシュするのね(ここでもキャッシュしてくれるから頭の中が混乱するのだよ)。でも、まぁ、Javadocを見ていると、Preferences って、flush とかもあるから、キャッシュしない方がおかしいということか・・・。何か疲れたけど、すっきり 🙂