今まで幾つかJava EE 6ベースの開発をしてきて、そのフィードバックとして色々と改善していきたい所がたくさんあるのですが、その1つにユーザ情報の管理やセキュリティ部分があります。
Java EEだと通常はレルムを使うのが標準的、という話は聞きますが、Apache Shiroのようなフレームワークがあったり、SpringにはSpring Securityみたいな便利ツールがあるとも聞きます。
で、「Java EEやってる皆どうしてるの?」って感じの質問がFacebookのPrimeFaces Groupで流れてて、最近だと「PicketLink」がいい、みたいな情報があったので調べてみました。
http://picketlink.org/
JBossで開発しているセキュリティとアイデンティティ管理のためのアプリケーションらしいです。
サイトトップをみると、結構色々機能がありそうです。SNS系のログインやSAML、OAuth2などのキーワードがみえます。
そしてドキュメントがすごく豊富(^^;
http://docs.jboss.org/picketlink/2/latest/reference/html/
とりあえず「5分で始める」という文字がみえたので、そこやってみました。
JBossなので、JBoss APやWildFlyベースな情報が多いですが、私は以下環境で試しました。
Windows 8
JDK 8
Java EE 7
GlassFish Server 4.0.1b05
Mavenのpom.xmlで
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-api</artifactId>
<scope>compile</scope>
<version>2.6.0.CR2</version>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-impl</artifactId>
<scope>runtime</scope>
<version>2.6.0.CR2</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.4.GA</version>
</dependency>
と定義します。最初ハマったのですが、loggingの設定がないと上手く動かせませんでした(^^;
で、コードは上記Get Startedにあるものとほぼ同じです。
CDI管理対象Beanで
package com.hogehoge.picketlinksample;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.PartitionManager;
import org.picketlink.idm.RelationshipManager;
import org.picketlink.idm.model.basic.BasicModel;
import org.picketlink.idm.model.basic.Grant;
import org.picketlink.idm.model.basic.Group;
import org.picketlink.idm.model.basic.GroupMembership;
import org.picketlink.idm.model.basic.Role;
import org.picketlink.idm.model.basic.User;
@Named
@ViewScoped
public class PicketLinkBean {
@Inject
private PartitionManager partitionMng;
@Inject
private IdentityManager identityMng;
@Inject
private RelationshipManager relationshipMng;
@PostConstruct
public void init(){
User user = new User("makimaki");
user.setFirstName("maki");
user.setLastName("horikita");
identityMng.add(user);
Group group = new Group("sweetpower");
identityMng.add(group);
Role role = new Role("actress");
identityMng.add(role);
relationshipMng.add(new GroupMembership(user, group));
relationshipMng.add(new Grant(user, role));
}
public String getUserName(){
User user = BasicModel.getUser(identityMng, "makimaki");
return user.getLastName() + user.getFirstName();
}
}
ユーザ情報管理(IdentityManager)、関連性の管理(RelationshipManager)はわりと直感的で使いやすそうな気もします。
とりあえず上記管理対象Beanに対となる画面を定義して
<h:body>
<h:outputLabel id="lblUser" value="#{picketLinkBean.userName}" />
</h:body>
実行
とりあえず、ちょっとしたサンプルレベルが動かせたので、色々触っていきながら、機能をまとめていきたいと思います。