[Defining User Attributes] ユーザ属性の定義

The Portlet Specification defines how Portlet Applications can use User Attributes.

The attributes must be defined in the portlet.xml like (see PLT.17.1):

ポートレット仕様はどのようにしてポートレットアプリケーションがユーザ属性を使用できるのかについて定義をしています。属性は 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>
<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>

Once attributes are defined like this, a portlet can access the current values for the logged on user as an unmodifiable Map from the PortletRequest using the USER_INFO constant defined in the PortletRequest interface (see PLT.17.2):

このように属性が定義されると、ポートレットは 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") : "";
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") : "";

What is not defined by the Portlet Specification is how the Portal must map the defined User Attributes to concrete attributes of a user.

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

[Mapping User Attributes] ユーザ属性のマッピング

Jetspeed-2 provides a very flexible way to define concrete User attributes and defining access to them.

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

Concrete User attributes are stored using User Preferences for which Jetspeed-2 provides its own database back end for storage (which is customizable by the way like almost any component of Jetspeed-2). The user attributes implementation leverages Jetspeed's java.util.prefs.Preferences implementation.

The concrete User attributes are stored under a specific node in the User preferences and can contain any named attribute at will.

These concrete User attributes can be mapped to the defined User Attributes in the portlet.xml in two ways:

  1. Using an exact match of attribute names
  2. Using a custom mapping definition in a jetspeed-portlet.xml

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

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

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

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

[Custom User Attribute Mapping] カスタムのユーザ属性マッピング

If you write new Portlet Applications with Jetspeed-2 as target Portal, defining User Attributes which match the concrete User attributes in the Portal usually will be quite straightforward

But, if you have an existing Portlet Application which you want to deploy on Jetspeed-2, there might be a mismatch between the attribute names needed by the Portlet Application and the concrete attribute names as stored in the Jetspeed-2 User Preferences.

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

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

Note: The Portlet Specification defines a set of attribute names which are recommended to be used in Appendix PLT.D.

Portlet Applications using these attribute names and Portals storing the concrete User attributes also using these names won't need any custom attribute mapping as will be described below.

Although Jetspeed-2 allows a fully free definition of the concrete User attributes, it is recommended to use these predefined attributes names as much as possible.

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

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

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

The jetspeed-portlet.xml allows jetspeed specific configurations and customizations to be specified.

This deployment document isn't required, but will be processed if found within the WEB-INF folder of a Portlet Application war.

Jetspeed specific configurations must be defined using the "http://portals.apache.org/jetspeed" namespace.

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

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

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

User attribute mapping is defined using an "user-attribute-ref" element containing a "name" element defining the custom user attribute name and a "name-link" element defining the concrete attribute name to which it is mapped:

ユーザ属性のマッピングはカスタムのユーザ属性名を定義する "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>
<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>

Using the above custom mapping as an example, the Portlet can now access the user attributes as follows:

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

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") : "";
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") : "";

Note that the email attribute for which no custom mapping was defined still can be access using exact name matching (provided the concrete attribute is defined for the logged on user).

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

[Defining User Attributes in Jetspeed-2] Jetspeed 2 でのユーザ属性の定義

Jetspeed-2 is provided with several Administrative Portlets, including for User Management.

Using the User Management Portlets, it is very easy to define or modify concrete attributes for a user:

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

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

The User Info Test demo Portlet, default deployed in Jetspeed-2 and displayed on the start page, uses the above example User Attribute definitions and displays the values for the logged on user (also showing that these can be accessed from both the PortletRequest as well as the HttpServletRequest from within a servlet):

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