2015-09-10今回は、picketlink-authorization-idm-jpaの説明をします。元のコードはここにあります。この例では、JPAと組み合わせた場合について示されています。License.picketlink-authorization-idm-jpa.warwarファイルの内容は次の通りです。http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"></beans>beans.xmlは前回と同様です。http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"></faces-config>faces-config.xmlは前回と同様です。</datasource></datasources>WildFlyのデータソース設定ファイルです。ここでは、WildFlyに内蔵されているH2データベースエンジンが使用されています。実運用では、他のデータベースを使うことをおすすめします。WildFly、JBoss以外のアプリケーションサーバの場合は、別の方法での設定が必要です。</persistence-unit></persistence>JPAの設定ファイルです。7行目で、picketlink-defaultという名前を付けています。jndi-nameに対応しています。}}25行目のunitNameは、persistence.xml7行目のpersistence-unitのnameに対応しています。getPicketLinkEntityManagerメソッドは、PicketLinkでJPAを使用するために定義しています。produceFacesContextメソッドは、FacesContextを返しています。}}このクラスは、PicketLinkがidentityに関連するデータをどのように保存するか定義しています。namedメソッドは、設定に名前を付けます。ここでは、defaultという名前にしています。storesメソッドは、IdentityStoresConfigurationBuilderを取得します。IdentityStoresConfigurationBuilderは、identityの保存の設定に用いられます。jpaメソッドは、JPAStoreConfigurationBuilderを取得します。JPAStoreConfigurationBuilderは、JPA向けのidentityの保存の設定に用いられます。supportAllFeaturesメソッドは、デフォルトの機能が使用可能となるようにしています。}}このクラスは、ユーザ情報を設定しています。35行目から60行目で、john、mary、janeの3人のユーザを設定しています。RoleとGroupがあり、62行目から72行目で、managerロール、superuserロール、salesグループを作成しています。77行目で、johnをsalesグループに入れています。80行目で、maryをsalesグループのmanagerロールにしています。83行目で、janeにsuperuserロールを割り当てています。URL=home.jsf"></head></html>/home.jsfへリダイレクトします(/home.xhtmlが呼び出されます)。identity.loggedIn}は、ログイン状態を取得しています。identityは、PicketLinkで定義されています。ログインしていない場合、35-67行目が表示されます。40行目と45行目のloginCredentialsは、PicketLinkで定義されているDefaultLoginCredentialsクラスです(DefaultLoginCredentialsクラスは、@Named(“loginCredentials”)が付加されています)。入力されたユーザ名とパスワードは、それぞれloginCredentials.userIdとloginCredentials.passwordに設定されます。53行目の[Login]ボタンを押すと、LoginController.java(後述)のloginメソッドが実行されます。ユーザ名とパスワードの組み合わせは、SecurityInitializer.javaで設定したjohn/demo、mary/demo、jane/demoの3つです。認証に失敗すると、この画面に戻って、36行目のメッセージを表示します。認証に成功した場合もこの画面に戻ります。15行目の#{identity.loggedIn}がtrueになるので、15行目から33行目を表示します。16行目の#{identity.account.loginName}はログイン名です。18行目の#{authorizationChecker.hasApplicationRole(‘superuser’)}は、AuthorizationChecker.java(後述)のhasApplicationRoleメソッドを呼び出しています。ログインユーザがsuperuserロールを持っている場合、このフラグメントが表示されます。22-24行目は、ログインユーザがsalesグループに属している場合に表示されます。26-28行目は、ログインユーザが、salesグループのmanagerロールを持っている場合に表示されます。out]ボタンを押すとログアウトします。}}28行目のFacesContextは、Resources.javaのproduceFacesContextメソッドから注入されています。home.xhtmlで[Login]ボタンが押されると、loginメソッドが実行されます。31行目でログインが実行されます。入力されたユーザ名とパスワードが既に、それぞれloginCredentials.userIdとloginCredentials.passwordに設定されています。認証に失敗した場合は、FacesMessageを作成します。}}34行目のhasApplicationRoleメソッドは、home.xhtmlの#{authorizationChecker.hasApplicationRole(‘superuser’)}から呼ばれています。このメソッドは、ログインユーザがロールを持っているかどうか検証します。getRoleメソッドとhasRoleメソッドは、Picketlinkで定義されているメソッドです。ここでは、ログインユーザがsuperuserロールを持っている場合にtrueを返します。39行目のisMemberメソッドは、home.xhtmlの#{authorizationChecker.isMember(‘sales’)}から呼ばれています。このメソッドは、ログインユーザがグループのメンバーかどうか検証します。getGroupメソッドとBasicModel.isMemberメソッドは、Picketlinkで定義されているメソッドです。ここでは、ログインユーザがsalesグループのメンバーの場合にtrueを返しています。‘sales’)}から呼ばれています。このメソッドは、ログインユーザがグループ内のロールを持っているかどうか検証します。BasicModel.hasGroupRoleメソッドは、Picketlinkで定義されているメソッドです。ここでは、ログインユーザがsalesグループのmanagerロールの場合にtrueを返しています。