jeesite(jeeplus)使用Shiro解決按實例分配資源權限問題

本文運行環境:jeeplus 2.6 等效於jeesite 1.2.7sql

仍是我如今重作的項目管理系統(PM)的項目,遇到這樣一個需求,除了傳統的RBAC之外,對管理的項目Project還可以對其中的個別模塊進行單獨受權,好比某我的,沒有管理項目的相應角色,可是針對某個項目,能夠臨時賦予其針對某個項目的角色,該角色擁有的權限只能在該項目生效。code

目前公司裏大體思路是所有拋開shiro的權限控制,本身寫表來記錄,寫一個權限基類,再繼承出子類,最後再在每一個Controller里加@ModelAttribute攔截,在須要判斷權限的模塊的全部請求參數中附帶上projectId,再去後臺查找,若是沒有權限拋出錯誤,在前臺判斷則用el表達式取變量值進行判斷。在使用過程當中,感受到極其繁瑣,因而業餘琢磨別的方式。包括路徑攔截,AOP等不一一贅述。通過查閱文檔,發現shiro原生是能夠支持的。 見參考文獻中的5、實例級別的權限blog

在本項目中:匹配字符串爲  模塊:子模塊:操做:實例ID(項目ID) ,其中前3段爲原有權限,已定義在menu裏繼承

下面是實現過程:項目管理

  1. 授予角色的過程:新建一個表,起名爲 prj_role_user ,其中包含 project_id ,role_id,user_id。每條記錄表明在某個項目中,授予user某個角色。這裏,爲了節省開發成本,不單獨寫角色表,統一存放在原有角色表中,爲了區分,我把角色的英文名前綴 改成project開頭,創建角色時,只授予其單個項目的權限。
  2. 查找權限:經過關聯查詢,去menu中讀取權限,權限字符串定義在裏面 
    select project_id,user_id,permission FROM  bd_prj_role_user as a
    
    join sys_role r on  a.role_id =r.id
    
    join sys_role_menu rm on rm.role_id = r.id
    
    join sys_menu m on m.id = rm.menu_id
    
    join sys_user u on u.id = a.user_id
    
    WHERE r.del_flag='0' and m.del_flag='0' and u.del_flag='0' and r.useable='1' and permission!=''
    
    and user_id = ${userId}
  3. 拼接字符串並受權,將上述sql查詢結果中的permission跟project_id拼接成字符串list,在SystemAuthorizingRealm中 找到覆蓋的 doGetAuthorizationInfo方法,賦給SimpleAuthorizationInfo。
    for (String permission : userProjectPermissionList) {
                 info.addStringPermission(permission);
             }

     

  4. 調用方法:不能經過註解,由於沒法引入projectId這個變量,改用
    SecurityUtils.getSubject().checkPermission("basic:project:view:"+project.getId());

    在前臺調用時,能夠在shiro標籤內加el表達式拼接權限字符串。開發

參考資料 張開濤:《跟我學Shiro》第三章:受權文檔

http://jinnianshilongnian.iteye.com/blog/2020017字符串

相關文章
相關標籤/搜索