過去、http://code.google.com/p/wicket-menu/ を使用して書いた以下は、
Wicket-auth 認証には対応していなかった。
http://blog.zaq.ne.jp/oboe2uran/article/513/
http://blog.zaq.ne.jp/oboe2uran/article/514/
これを Wicket-auth に対応させるなら、Horizon menu bar のコンポーネントを
Auth 認証用に新しく作成し、MenuItem を継承したいところだが、継承するろ
サブメニューを追加するメソッド名が被って引数の型が異なりタイプセーフにならない弊害もある
(長いので分けて投稿する)
メニュー名とリンク先を宣言する MenuItem → AuthMenuItem
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.authentication.AuthenticatedWebSession;
import org.apache.wicket.markup.html.WebPage;
import com.cooldatasoft.common.DestinationType;
/**
* AuthMenuItem
*/
public class AuthMenuItem implements Serializable{
private int destinationType;
private String menuText;
private Class<? extends WebPage> responsePageClass;
private WebPage responsePage;
private String externalLink;
private List<AuthMenuItem> subMenuItemList = new ArrayList<AuthMenuItem>();
private boolean seperator = false;
private boolean submenuTitle = false;
private String[] ary;
public AuthMenuItem(boolean seperator,String... roles){
setSeperator(true);
setDestinationType(DestinationType.NONE);
this.ary = roles;
}
public AuthMenuItem(String submenuTitle,String... roles){
setSubmenuTitleTitle(true);
setMenuText(submenuTitle);
setDestinationType(DestinationType.NONE);
this.ary = roles;
}
public <T extends WebPage> AuthMenuItem(String menuText,T destinationPage,String... roles){
setMenuText(menuText);
setResponsePage(destinationPage);
setSubMenuItemList(new ArrayList<AuthMenuItem>());
setDestinationType(DestinationType.WEB_PAGE_INSTANCE);
this.ary = roles;
}
public AuthMenuItem(String menuText,Class<? extends WebPage> destinationPageClass,String... roles){
setMenuText(menuText);
setResponsePageClass(destinationPageClass);
setSubMenuItemList(new ArrayList<AuthMenuItem>());
setDestinationType(DestinationType.WEB_PAGE_CLASS);
this.ary = roles;
}
public AuthMenuItem(String menuText,Class<? extends WebPage> destinationWebPage
,List<AuthMenuItem> subMenuItemList,String... roles)throws InstantiationException,IllegalAccessException{
this(menuText,destinationWebPage.newInstance(),subMenuItemList);
setDestinationType(DestinationType.WEB_PAGE_CLASS);
this.ary = roles;
}
public <T extends WebPage>AuthMenuItem(String menuText
,T destinationPage,List<AuthMenuItem> subMenuItemList,String... roles){
setMenuText(menuText);
setResponsePage(destinationPage);
setSubMenuItemList(subMenuItemList);
setDestinationType(DestinationType.WEB_PAGE_INSTANCE);
this.ary = roles;
}
// setter や getter を用意する!
// サブメニュー(DropDownで表示するメニュー)の追加
public void addSubmenu(AuthMenuItem subMenuItem){
getSubMenuItemList().add(subMenuItem);
}
// メニュー表示させるかどうかを boolean で返す。
public boolean isView(AuthenticatedWebSession session){
String role = session.getRoles().toString();
if (this.ary.length==0) return true;
boolean rtn = false;
for(int i=0;i < this.ary.length;i++){
if (this.ary[i].equals(role)){
rtn = true;
break;
}
}
return rtn;
}
}
AuthMenuItem の重要なところは、
public boolean isView(AuthenticatedWebSession session)
メソッドである。これを 認証用に用意するHorizon menu bar のコンポーネントを
生成する時に、org.apache.wicket.Component.getSession() から取得するセッションオブジェクト
を渡すことで、アクセスしたセッションの Role と AuthMenuItem の Role 群に存在するかを
問い合わせていることだ。
メニューのタイトルとリンク先を定義する時、要件的に 認証 Role が必要であり
String... roles をAuthMenuItemコンストラクタの引数としていている。
Role名 が1つも指定されなければ、無条件にメニューを表示させる。
roles の型が String であるが、必ずしも "ADMIN" のように指定しなくても
Roles.ADMIN と指定してもよい。
次回は、Horizon menu bar のコンポーネント