jeesite(jeeplus)使用Shiro解决按实例分配资源权限问题

本文运行环境:jeeplus 2.6 等效于jeesite 1.2.7

还是我现在重做的项目管理系统(PM)的项目,遇到这样一个需求,除了传统的RBAC以外,对管理的项目Project还能够对其中的个别模块进行单独授权,比如某个人,没有管理项目的相应角色,但是针对某个项目,可以临时赋予其针对某个项目的角色,该角色拥有的权限只能在该项目生效。

目前公司里大致思路是全部抛开shiro的权限控制,自己写表来记录,写一个权限基类,再继承出子类,最后再在每个Controller里加@ModelAttribute拦截,在需要判断权限的模块的所有请求参数中附带上projectId,再去后台查找,如果没有权限抛出错误,在前台判断则用el表达式取变量值进行判断。在使用过程中,感觉到极其繁琐,于是业余琢磨别的方式。包括路径拦截,AOP等不一一赘述。经过查阅文档,发现shiro原生是可以支持的。 见参考文献中的5、实例级别的权限

在本项目中:匹配字符串为  模块:子模块:操作:实例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

转载于:https://my.oschina.net/u/2351812/blog/1789637

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供关于JeePlus的新手教程。JeePlus是一个基于Java的开源框架,用于快速开发企业级Java应用程序。它提供了许多便捷的功能和工具,可以简化开发过程,并提高开发效率。 以下是一个简单的JeePlus新手教程的大纲: 1. 环境设置: - 安装Java开发工具包(JDK)和集成开发环境(IDE),例如Eclipse或IntelliJ IDEA。 - 下载JeePlus框架,并导入到IDE中。 2. 创建新项目: - 在IDE中创建一个新的Java项目。 - 将JeePlus框架添加到项目的依赖中。 3. 数据库配置: - 配置数据库连接,包括数据库驱动程序和连接URL。 - 创建数据库表格或使用现有表格。 4. 实体类和数据访问对象(DAO): - 创建Java实体类,映射到数据库表格。 - 创建DAO类,用于对实体类进行数据库操作,例如增删改查。 5. 业务逻辑层: - 创建服务类,实现业务逻辑。 - 在服务类中调用DAO类来操作数据库。 6. 控制器层: - 创建控制器类,处理用户请求。 - 使用注解来映射URL和方法,处理HTTP请求和响应。 7. 视图层: - 创建JSP页面,用于显示数据和与用户交互。 - 使用JSTL(JavaServer Pages标准标签库)和EL(表达式语言)来处理页面逻辑和显示数据。 8. 测试和调试: - 编写单元测试用例,确保代码的正确性。 - 使用调试工具来调试代码并解决错误。 这只是一个简单的JeePlus新手教程大纲,涵盖了基本的项目搭建和开发流程。当然,JeePlus框架还有更多高级功能和特性,您可以根据需要深入学习和应用。希望对您有所帮助!如果您有任何具体的问题,可以随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值