1.struts-menu Permissions
1.1. 背景
PermissionsAdapter接口,在菜單框架中定義可插入的適配器,該適配器原來校驗對菜單的訪問。接口中只有一個方法:public boolean isAllowed(MenuComponent menu),參數是menu-config.xml文件中定義的一個菜單(Menu)或菜單項(Item),該方法判斷該菜單是否容許被顯示。
在顯示菜單的時候,每一個菜單或菜單項都要做爲參數調用isAllowed方法,若是返回true就顯示該菜單,不然就不顯示菜單。
Struts-menu項目中內置有類RolesPermissionsAdapter實現了PermissionsAdapter接口。該適配器在容 器管理安全性是被用來進行菜單訪問的驗證,將web.xml文件中定義的用戶安全角色映射到menu-config.xml文件中設置的菜單/菜單項容許 訪問角色列表。其中的角色是在。
1.2. 步驟0
該步驟一般是J2EE/JAAS等安全配置的一部分。爲每一個用戶或用戶組分配角色。角色是在web.xml文件中定義的。
1.3. 步驟1:爲菜單定義PermissionsAdapter
用來顯示菜單的JSP標記<menu:useMenuDisplayer/>標記中有一個可選的屬性:permissions。若是設置了 該屬性,該屬性值就做爲名字,在application/request/session/page域內查找PermissionsAdapter的對 象。而後將找到的適配器應用到菜單的顯示中。
值得注意的是,在permissions的屬性值中有一個值是特殊處理 的??rolesAdapter。若是設置了permissions="rolesAdapter",就說明在驗證菜單是否顯示的過程當中,不是在 application/request/session/page域中查找適配器,而是建立並使用新的RolesPermissionsAdapter 對象。這樣就只須要在<menu:useMenuDisplayer/>標記中添加屬性 permissions="rolesAdapter",而無需定義本身的PermissionsAdapter實現。
[url]http://www.javabiz.cn[/url]
1.4. 步驟2:將角色映射到menu-config.xml中的菜單/菜單項
在menu-config.xml文件中的<Menu/>和<Item/>標記有一個可選的屬性:roles。該屬性在與 RolesPermissionsAdapter聯合使用的時候,其值是全部能夠看到該菜單/菜單項的角色列表,角色之間以空格分隔。
RolesPermissionsAdapter對象會根據空格從角色列表中取得各個角色,併爲每一個角色調用request.isUserInRole()方法。對於調用返回true的角色,就顯示對應的菜單/菜單項。
例如,在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>
說明:任何User角色的用戶都可以看到該菜單,也就是自動看到User Preferences菜單項。只有Moderator和System角色的用戶才能看到Moderator Preferences菜單項。而只有System角色的用戶纔可以看到Site Preferences菜單項。
固然,用戶看不到不等於沒有權限訪問,用戶能夠直接輸入鏈接進行訪問。所以要避免非法訪問,還要進行必要的安全措施。
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屬性給出了兩個可以看到該菜單的角色:tomcat,role1 1.5.2. JSP頁面中 <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屬性,表示顯示的菜單要進行角色的驗證