ユーザ属性の定義

ポートレット仕様はどのようにしてポートレットアプリケーションがユーザ属性を使用できるのかについて定義をしています。属性は portlet.xml で以下のように定義されます (PLT.17.1 参照)。

<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
   <user-attribute>
      <description>User Given Name</description>
      <name>user.name.given</name>
   </user-attribute>
   <user-attribute>
      <description>User Last Name</description>
      <name>user.name.family</name>
   </user-attribute>
   <user-attribute>
      <description>User eMail</description>
      <name>user.home-info.online.email</name>
   </user-attribute>
   ...
</portlet-app>

このように属性が定義されると、ポートレットは PortletRequest インタフェース (PLT.17.2 参照) で定義された USER_INFO 定数を使って PortletRequest から変更できない Map としてログインしているユーザの現在値にアクセスすることが可能になります。

Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null) ? (String)userInfo.get("user.name.given") : "";
String lastName = (userInfo!=null) ? (String)userInfo.get("user.name.family") : "";
String email = (userInfo!=null) ? (String)userInfo.get("user.home-info.online.email") : "";

ポートレット仕様で定義されないのは、ポータルが定義されたユーザ属性をユーザの具体的な属性にどのようにマッピングするかということです。

ユーザ属性のマッピング

Jetspeed 2 は具体的なユーザ属性を定義したり、そのユーザ属性へのアクセスを定義したりするためにとても柔軟な方法を提供しています。

具体的なユーザ属性は Jetspeed 2 が情報を格納しておくためのデータベースバックエンドとしている User Preferences を使って格納されます (これは Jetspeed 2 の殆んどのコンポーネントと同じような方法でカスタマイズできます)。ユーザ属性の実装は Jetspeed の java.util.prefs.Preferences の実装を利用しています。

具体的なユーザ属性は User preferences 内の特定のノード下に格納されます。そして任意の名前の属性を自由に含むことができます。

これらの具体的なユーザ属性は portlet.xml 内で以下のような 2 つの方法で定義されたユーザ属性にマップされます。

  1. 属性名との完全一致の使用
  2. jetspeed-portlet.xml 内で定義されるカスタムマッピングの使用

カスタムのユーザ属性マッピング

もし対象とするポータルとして Jetspeed 2 を利用して新しいポートレットアプリケーションを書いたのなら、ポータル内で具体的なユーザ属性と一致する User Attributes を定義することは簡単でしょう。

しかし、もし既に存在するポートレットアプリケーションを Jetspeed 2 上に配備したいのなら、ポートレットアプリケーションに必要な属性名と Jetspeed 2 の User Preferences に格納される具体的な属性名の間のミスマッチがあるかもしれません。

注意: ポートレット仕様は Appendix PLT.D. で推奨される属性名のセットを定義しています。

これらの属性名を使ったポートレットアプリケーションと具体的なユーザ属性をこれらの名前を使って格納しているポータルは以下で述べるようなカスタムの属性のマッピングを使う必要は一切ありません。

Jetspeed 2 は具体的なユーザ属性を全く自由に定義することができますが、可能な限りこれらのあらかじめ定義された属性を使うことが推奨されます。

jetspeed-portlet.xml に jetspeed 特有の設定やカスタマイズを記述することができます。

このドキュメントの配備は必須ではありません。しかし、もしポートレットアプリケーションの war ファイル内の WEB-INF フォルダにこのドキュメントが見付かれば、処理が行われます。

Jetspeed 特有の設定は "http://portals.apache.org/jetspeed" 名前空間を使って定義しなければなりません。

ユーザ属性のマッピングはカスタムのユーザ属性名を定義する "name" エレメントと、その属性名にマップされる具体的な属性名を定義する"name-link" エレメントを含む "user-attribute-ref" エレメントによって定義されます。

<portlet-app version="1.0" 
   xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" 
   xmlns:js="http://portals.apache.org/jetspeed"> 
   <js:user-attribute-ref>
      <js:name>user-name-given</js:name>
      <js:name-link>user.name.given</js:name-link>
   </js:user-attribute>
   <js:user-attribute-ref>
      <js:name>user-name-family</js:name>
      <js:name-link>user.name.family</js:name-link>
   </js:user-attribute>
   ...
</portlet-app>

先の例のようなカスタムのマッピングを使って、ポートレットは次のようにユーザ属性にアクセスできます。

Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null) ? (String)userInfo.get("user-name-given") : "";
String lastName = (userInfo!=null) ? (String)userInfo.get("user-name-family") : "";
String email = (userInfo!=null) ? (String)userInfo.get("user.home-info.online.email") : "";

カスタムのマッピングが定義されていない (ログオンしているユーザのために定義されている具体的な属性が提供されている) email 属性も完全一致でのアクセスが可能であることに注意してください。

Jetspeed 2 でのユーザ属性の定義

Jetspeed 2 にはユーザ管理を含むいくつかの管理ポートレットがあります。

ユーザ管理ポートレットを使って、非常に簡単にユーザに対する具体的な属性を定義したり修正したりできます。

デフォルトの Jetspeed 2 で配備され、スタートページに表示される、ユーザ情報テスト (User Info Test) デモポートレットは前述の例のユーザ属性定義を使い、ログオンユーザの値を表示しています。(これらの値はサーブレット内の HttpServletRequest と PortletRequest の両方からアクセス可能であることを示しています)