织梦CMS - 轻松建站从此开始!

24小时在线平台

当前位置: 24小时在线平台 > 部署教程大全 > 文章页

RuoYi 若依框架 前后端不分离版 实现权限管理

时间:2025-05-14 09:05来源: 作者:admin 点击: 1 次
数据权限 在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。 例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。 如设置只能看本公司、或者本部门的数据,对于特殊的领导,可能需要跨部门的数

在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。

例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。
如设置只能看本公司、或者本部门的数据,对于特殊的领导,可能需要跨部门的数据, 因此程序不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制。

注意:
若依系统 默认系统管理员admin拥有所有数据权限(userId=1),默认角色拥有所有数据权限(如不需要数据权限不用设置数据权限操作)

数据权限使用 1、实体类继承BaseEntity

若依代码生成 的实体类会默认继承。

2、在系统管理设置角色

在(系统管理-角色管理)设置需要数据权限的角色 目前支持以下几种权限

全部数据权限

自定数据权限

部门数据权限

部门及以下数据权限

仅本人数据权限

3、添加@DataScope注解

在需要数据权限控制方法(一般就是XXXXXXServiceImpl)上添加@DataScope注解。

注解参数说明 参数 类型 默认值 描述 解释
deptAlias   String     部门表的别名   就是sql语句中有部门权限标识的表的名字  
userAlias   String     用户表的别名   就是sql语句中有用户权限标识的表的名字  

部门数据权限注解

@DataScope(deptAlias = "d") public List<...> select(...) { return mapper.select(...); }

部门及用户权限注解

@DataScope(deptAlias = "d", userAlias = "u") public List<...> select(...) { return mapper.select(...); } 4、添加数据范围过滤

在src/main/resources/mapper/xxxx/xxxxxMapper.xml中查询底部标签添加数据范围过滤。
例1:

<select parameterType="..." resultMap="...Result"> <include refid="select...Vo"/> <!-- 添加下面两行到查询语句的where语句下 --> <!-- 数据范围过滤 --> ${params.dataScope} </select>

例2:

<select parameterType="..." resultMap="...Result"> <include refid="select...Vo"/> <where> <!-- 添加下面两行到查询语句的where语句块内 --> <!-- 数据范围过滤 --> ${params.dataScope} </where> </select> 实现原理

实现原理就是sql语句的拼接,在where语句后面拼接了查询权限的sql语句。
具体逻辑实现代码在: com.ruoyi.framework.aspectj.DataScopeAspect

深度分析链接简单理解如下:

未过滤数据权限的情况下的用户管理:

select u.user_id, u.dept_id, u.login_name, u.user_name, u.email , u.phonenumber, u.password, u.sex, u.avatar, u.salt , u.status, u.del_flag, u.login_ip, u.login_date, u.create_by , u.create_time, u.remark, d.dept_name from sys_user u left join sys_dept d on u.dept_id = d.dept_id where u.del_flag = '0'

已过滤数据权限的情况下的用户管理:

select u.user_id, u.dept_id, u.login_name, u.user_name, u.email , u.phonenumber, u.password, u.sex, u.avatar, u.salt , u.status, u.del_flag, u.login_ip, u.login_date, u.create_by , u.create_time, u.remark, d.dept_name from sys_user u left join sys_dept d on u.dept_id = d.dept_id where u.del_flag = '0' and u.dept_id in ( select dept_id from sys_role_dept where role_id = 2 )

结果很明显,我们多了如下语句。通过角色部门表(sys_role_dept)完成了数据权限过滤

and u.dept_id in ( select dept_id from sys_role_dept where role_id = 2 )

注意
仅实体继承BaseEntity才会进行处理,SQL语句会存放到BaseEntity对象中的params属性中,然后在xml中通过${params.dataScope}获取拼接后的语句。

Shiro注解权限 控制 名称 作用 备注
@RequiresAuthentication   使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。    
@RequiresGuest   使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是gust身份,不需要经过认证或者在原先的session中存在记录。    
@RequiresPermissions   当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。    
@RequiresRoles   当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。    
@RequiresUser   当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。    
@RequiresRoles

@RequiresRoles注解用于配置接口要求用户拥有某(些)角色才可访问,它拥有两个参数

参数 类型 描述
value   String[]   角色列表  
logical   Logical   角色之间的判断关系,默认为Logical.AND  

示例1: 以下代码表示必须拥有admin角色才可访问

@RequiresRoles("admin") public AjaxResult save(...) { return AjaxResult.success(...); }

示例2: 以下代码表示必须拥有admin和common角色才可访问

@RequiresRoles({"admin", "common"}) public AjaxResult save(...) { return AjaxResult.success(...); }

示例3: 以下代码表示需要拥有admin或common角色才可访问

@RequiresRoles(value = {"admin", "common"}, logical = Logical.OR) public AjaxResult save(...) { return AjaxResult.success(...); } @RequiresPermissions

@RequiresPermissions注解用于配置接口要求用户拥有某(些)权限才可访问,它拥有两个参数

参数 类型 描述
value String[] 权限列表
logical Logical 权限之间的判断关系,默认为Logical.AND
示例1: 以下代码表示必须拥有system:user:add权限才可访问

@RequiresPermissions("system:user:add") public AjaxResult save(...) { return AjaxResult.success(...); }

示例2: 以下代码表示必须拥有system:user:add和system:user:update权限才可访问

@RequiresPermissions({"system:user:add", "system:user:update"}) public AjaxResult save(...) { return AjaxResult.success(...); }

示例3: 以下代码表示需要拥有system:user:add或system:user:update角色才可访问

@RequiresPermissions(value = {"system:user:add", "system:user:update"}, logical = Logical.OR) public AjaxResult save(...) { return AjaxResult.success(...); }

提示
Shiro的认证注解处理是有内定的处理顺序的,如果有个多个注解的话,前面的通过了会继续检查后面的,若不通过则直接返回,处理顺序依次为(与实际声明顺序无关) RequiresRoles、RequiresPermissions、RequiresAuthentication、RequiresUser、RequiresGuest。
例如:你同时声明了RequiresRoles和RequiresPermissions,那就要求拥有此角色的同时还得拥有相应的权限。

(责任编辑:)
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:
发布者资料
查看详细资料 发送留言 加为好友 用户等级: 注册时间:2025-05-17 17:05 最后登录:2025-05-17 17:05
栏目列表
推荐内容
  • 天翼云服务器怎么搭建https

    为了保证网络交流的安全性,越来越多的网站开始采用HTTPS协议。而为了使用HTTPS协议,需要在服务器上安装SSL证书。而对于天翼云服务器而言,搭建HTTPS协...

  • AI赋能住房公积金业务管理提质增效

    中国建设新闻网是由住房和城乡建设部主管,中国建设报社主办的互联网站。坚持“大资源平台,大数据高地”的目标,为住房城乡建设部提供信息参考与决策支持、为地方和住建系...

  • 【VMware vSAN 7.0】4.1 选择或验证存储设备的兼容性

    文章浏览阅读1.2k次。部署vSAN之前的一个重要步骤是通过查阅VMware 兼容性指南确认存储设备、驱动程序和固件与vSAN兼容。验证vSAN兼容性的方法有多...

  • 数据软件即服务:混合部署架构介绍

    由于要集成客户的数据堆栈,所以我们需要提供最高级别的安全性和遵从性。问题是:我们将如何构建它们?SaaS 吗?On-prem 吗?还是别的什么方法?为了实现这些...

  • 黑马程序员Docker快速入门到项目部署(学习笔记)

    文章浏览阅读5.1k次,点赞24次,收藏65次。命令说明文档地址拉取镜像推送镜像到DockerRegistry查看本地镜像docker rmi删除本地镜像doc...

  • 云服务器 ECS 部署前后端分离项目(若依)详细教程

    文章浏览阅读800次。前言自己白嫖到云服务器一个月,岂不是要赶快享受一下,另外也早就有买服务器部署自己项目的想法,刚好机会来了。来着网络对应若依前后端分离项目来...

  • 阿里云云服务器网站域名管理

    阿里云云服务器(Alibaba Cloud Elastic Compute Service,ECS)是阿里巴巴集团旗下的云计算服务之一,它提供稳定可靠的虚拟机实...

  • jboss部署上传文件问题

    以下内容是CSDN社区关于jboss部署上传文件问题相关内容,如果想了解更多关于Java EE社区其他内容,请访问CSDN社区。...

  • 天风证券:给予嘉益股份买入评级

      天风证券股份有限公司孙谦,孙海洋近期对嘉益股份进行研究并发布了研究报告《下游景气及供应链稀缺性延续》,给予嘉益股份买入评级。  嘉益股份(301004)  ...

  • 合肥经济学院部署校园消防安全教育示范基地建设工作

    近日,合肥经济学院召开专题会议,部署校园消防安全教育示范基地建设工作。该院党委副书记、副院长吴国兵,副院长伍德勤,安全管理处、学生处、教务处、后勤管理处等相关部...