本文运行环境: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》第三章:受权文档