国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Appfuse:權限控制

2019-11-15 00:53:39
字體:
來源:轉載
供稿:網友
Appfuse:權限控制

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即可,如下:

 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

使用Menu控制權限只能控制到菜單的可見性,如果想深入到數據控制需要自己再處理。下面是通過切入OnSubmit方法做的操作控制:

1. 首先定義切面,切入OnSubmit方法

 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

2. 定義自己的權限驗證方法,下面是個簡單的示例

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

這樣基本的權限控制目的就能達到。

關于用戶看到的數據權限我通過url中的參數,結合search來控制,但這樣只要修改url中的參數就可越過數據權限,有待優化。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长宁县| 晋城| 保康县| 徐水县| 灯塔市| 彭水| 曲阳县| 永康市| 新蔡县| 蒲江县| 西安市| 岳阳县| 忻城县| 石河子市| 广昌县| 金寨县| 塔河县| 台湾省| 石渠县| 凤台县| 灵台县| 张家界市| 湘乡市| 时尚| 宿州市| 尼玛县| 涡阳县| 土默特右旗| 阳东县| 进贤县| 永和县| 措勤县| 海原县| 庄河市| 松桃| 三门县| 阳西县| 廉江市| 安福县| 牙克石市| 苍南县|