本文運行環境:jeeplus 2.6 等效於jeesite 1.2.7sql
仍是我如今重作的項目管理系統(PM)的項目,遇到這樣一個需求,除了傳統的RBAC之外,對管理的項目Project還可以對其中的個別模塊進行單獨受權,好比某我的,沒有管理項目的相應角色,可是針對某個項目,能夠臨時賦予其針對某個項目的角色,該角色擁有的權限只能在該項目生效。code
目前公司裏大體思路是所有拋開shiro的權限控制,本身寫表來記錄,寫一個權限基類,再繼承出子類,最後再在每一個Controller里加@ModelAttribute攔截,在須要判斷權限的模塊的全部請求參數中附帶上projectId,再去後臺查找,若是沒有權限拋出錯誤,在前臺判斷則用el表達式取變量值進行判斷。在使用過程當中,感受到極其繁瑣,因而業餘琢磨別的方式。包括路徑攔截,AOP等不一一贅述。通過查閱文檔,發現shiro原生是能夠支持的。 見參考文獻中的5、實例級別的權限blog
在本項目中:匹配字符串爲 模塊:子模塊:操做:實例ID(項目ID) ,其中前3段爲原有權限,已定義在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}
for (String permission : userProjectPermissionList) { info.addStringPermission(permission); }
SecurityUtils.getSubject().checkPermission("basic:project:view:"+project.getId());
在前臺調用時,能夠在shiro標籤內加el表達式拼接權限字符串。開發
參考資料 張開濤:《跟我學Shiro》第三章:受權文檔