1. struts-menu Permissions
1.1. 背景
PermissionsAdapter接口,在菜單框架中定義可插入的適配器,該適配器原來(lái)校驗(yàn)對(duì)菜單的訪問(wèn)。接口中只有一個(gè)方法:public boolean isAllowed(MenuComponent menu),參數(shù)是menu-config.xml文件中定義的一個(gè)菜單(Menu)或菜單項(xiàng)(Item),該方法判斷該菜單是否允許被顯示。
在顯示菜單的時(shí)候,每個(gè)菜單或菜單項(xiàng)都要作為參數(shù)調(diào)用isAllowed方法,如果返回true就顯示該菜單,否則就不顯示菜單。
Struts-menu項(xiàng)目中內(nèi)置有類RolesPermissionsAdapter實(shí)現(xiàn)了PermissionsAdapter接口。該適配器在容器管理安全性是被用來(lái)進(jìn)行菜單訪問(wèn)的驗(yàn)證,將web.xml文件中定義的用戶安全角色映射到menu-config.xml文件中設(shè)置的菜單/菜單項(xiàng)允許訪問(wèn)角色列表。其中的角色是在。
1.2. 步驟0
該步驟通常是J2EE/JAAS等安全配置的一部分。為每個(gè)用戶或用戶組分配角色。角色是在web.xml文件中定義的。
1.3. 步驟1:為菜單定義PermissionsAdapter
用來(lái)顯示菜單的JSP標(biāo)記<menu:useMenuDisplayer/>標(biāo)記中有一個(gè)可選的屬性:permissions。如果設(shè)置了該屬性,該屬性值就作為名字,在application/request/session/page域內(nèi)查找PermissionsAdapter的對(duì)象。然后將找到的適配器應(yīng)用到菜單的顯示中。
值得注意的是,在permissions的屬性值中有一個(gè)值是特殊處理的――rolesAdapter。如果設(shè)置了permissions="rolesAdapter",就說(shuō)明在驗(yàn)證菜單是否顯示的過(guò)程中,不是在application/request/session/page域中查找適配器,而是創(chuàng)建并使用新的RolesPermissionsAdapter對(duì)象。這樣就只需要在<menu:useMenuDisplayer/>標(biāo)記中添加屬性permissions="rolesAdapter",而無(wú)需定義自己的PermissionsAdapter實(shí)現(xiàn)。
1.4. 步驟2:將角色映射到menu-config.xml中的菜單/菜單項(xiàng)
在menu-config.xml文件中的<Menu/>和<Item/>標(biāo)記有一個(gè)可選的屬性:roles。該屬性在與RolesPermissionsAdapter聯(lián)合使用的時(shí)候,其值是所有可以看到該菜單/菜單項(xiàng)的角色列表,角色之間以空格分隔。
RolesPermissionsAdapter對(duì)象會(huì)根據(jù)空格從角色列表中取得各個(gè)角色,并為每個(gè)角色調(diào)用request.isUserInRole()方法。對(duì)于調(diào)用返回true的角色,就顯示對(duì)應(yīng)的菜單/菜單項(xiàng)。
例如,在menu-config.xml文件中配置如下:
<Menu name="PrefsMenu" title="Preferences" roles="User">
<Item name="UserPrefs" title="User Preferences" page="prefs.do"/>
<Item name="ModPrefs" title="Moderator Preferences"
page="modPrefs.do" roles="Moderator System"/>
<Item name="AdminPrefs" title="Site Preferences"
page="sitePrefs.do" roles="System"/>
</Menu>
說(shuō)明:任何User角色的用戶都能夠看到該菜單,也就是自動(dòng)看到User Preferences菜單項(xiàng)。只有Moderator和System角色的用戶才能看到Moderator Preferences菜單項(xiàng)。而只有System角色的用戶才能夠看到Site Preferences菜單項(xiàng)。
當(dāng)然,用戶看不到不等于沒(méi)有權(quán)限訪問(wèn),用戶可以直接輸入連接進(jìn)行訪問(wèn)。因此要避免非法訪問(wèn),還要進(jìn)行必要的安全措施。
1.5. 示例(rolesMenu.jsp)
1.5.1. menu-struts.xml文件中
<Menu name="Permissions" title="Permissions" roles="tomcat,role1">
<Item title="Change" location="permissionsForm.jsp"/>
</Menu>
roles屬性給出了兩個(gè)能夠看到該菜單的角色:tomcat,role1
1.5.2. JSP頁(yè)面中
<menu:useMenuDisplayer name="ListMenu"
bundle="org.apache.struts.action.MESSAGE"
permissions="rolesAdapter">
<menu:displayMenu name="ToDoListMenuFile"/>
<menu:displayMenu name="ToDoListMenuEdit"/>
<menu:displayMenu name="Permissions"/>
</menu:useMenuDisplayer>
給出permissions屬性,表示顯示的菜單要進(jìn)行角色的驗(yàn)證