Appfuse的權限控制依賴于Struts的Menu機制,common下的menu.jsp是對菜單順序的定義,詳細的菜單項和菜單鏈接及權限再menu-config.xml中控制,如下:
<Menu name="Logout" title="user.logout" page="/logout" roles="ROLE_ADMIN,ROLE_USER,ROLE_ roles中的值即是role表中的name,給那個角色分配菜單的權限,則把角色的name加入到菜單定義的roles中即可。 但使用過程中會發現,這樣定義好之后菜單出來是亂的,源自appfuse中的一個Bug,修改文件navbarMenu.vm即可,如下: 使用Menu控制權限只能控制到菜單的可見性,如果想深入到數據控制需要自己再處理。下面是通過切入OnSubmit方法做的操作控制: 1. 首先定義切面,切入OnSubmit方法 2. 定義自己的權限驗證方法,下面是個簡單的示例 這樣基本的權限控制目的就能達到。 關于用戶看到的數據權限我通過url中的參數,結合search來控制,但這樣只要修改url中的參數就可越過數據權限,有待優化。
1 #macro( displayNavbarMenu $menu $count) 2 #if ($displayer.isAllowed($menu)) 3 #set ($count = $count + 1) 4 ## set menu title 5 #set ($title = $displayer.getMessage($menu.title)) 6 #if (!$menu.url) #set ($url="javascrnavbarMenu.vm

1 /** 2 * 做權限驗證,如果用戶無權限,則拒絕請求 3 */ 4 @Override 5 public Object invoke(MethodInvocation invocation) throws Throwable { 6 try { 7 Boolean allow = false; 8 // 當前執行的操作 9 String action = "";10 // 獲取當前操作的用戶的角色11 User user = userManager.get(getCurrentUserID());12 Set<Role> roleList = user.getRoles();13 // 當前執行的操作,從Request中獲取14 // 基于OnSubmit的簽名獲取RequestString onSubmit(Greatplace greatplace,15 // BindingResult errors, HttpServletRequest request,16 // HttpServletResponse response)17 if (invocation.getArguments().length == 418 && invocation.getArguments()[2].getClass() == HttpServletRequest.class) {19 HttpServletRequest request = (HttpServletRequest) invocation20 .getArguments()[2];21 if (request.getParameter("save") != null) {22 action = RolePermissionManager.PERMISSION_SAVE;23 } else if (request.getParameter("delete") != null) {24 action = RolePermissionManager.PERMISSION_DELETE;25 } else if (request.getParameter("approve") != null26 || request.getParameter("unapprove") != null) {27 action = RolePermissionManager.PERMISSION_APPROVE;28 }29 for (Role r : roleList) {30 allow = RolePermissionManager.haspermission(r.getName(),31 action);32 if (allow)33 break;34 }35 if (!allow) {36 request.getsession().setAttribute("successMessages",37 "對不起,您無權執行該操作!");38 return request.getPathInfo().replace("/", "");39 }40 }41 Object result = invocation.proceed();42 return result;43 44 } catch (IllegalArgumentException ex) {45 log.error(ex);46 throw ex;47 }48 }SubmitAdvice
public class RolePermissionManager { /** * 權限項:保存 */ public static final String PERMISSION_SAVE = "save"; /** * 權限項:審批 */ public static final String PERMISSION_APPROVE = "approve"; /** * 權限項:刪除 */ public static final String PERMISSION_DELETE = "delete"; /** * 角色:管理員 */ public static final String ROLE_ADMIN = "ROLE_ADMIN"; /** * 角色:普通用戶 */ public static final String ROLE_USER = "ROLE_USER"; /** * 基于角色的權限矩陣 */ private static Map<String,List<String>> permissionList; /** * 初始化角色的權限項 */ public RolePermissionManager(){ } /** * 判斷當前角色是否有指定的權限項 * @param roleName 角色名稱 * @param permissionName 權限項名稱 * @return */ public static Boolean hasPermission(String roleName,String permissionName){ return getPermissionList().get(roleName).contains(permissionName); } /** * 定義角色和權限項的規則 * @return */ public static Map<String,List<String>> getPermissionList(){ if(permissionList == null){ permissionList = new HashMap<String,List<String>>(); //定義管理員的權限 List<String> adminPermissionList = new ArrayList<String>(); adminPermissionList.add(PERMISSION_SAVE); adminPermissionList.add(PERMISSION_APPROVE); adminPermissionList.add(PERMISSION_DELETE); permissionList.put(ROLE_ADMIN, adminPermissionList); //定義普通用戶的權限 List<String> userPermissionList = new ArrayList<String>(); permissionList.put(ROLE_USER, userPermissionList); } return permissionList; }}RolePermissionManager
新聞熱點
疑難解答