首页 > 其他分享 >RuoYi 若依框架 前后端不分离版 实现权限管理

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

时间:2022-11-24 21:46:46浏览次数:62  
标签:... RuoYi 若依 dept user 注解 权限 id

数据权限

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

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

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

数据权限使用

1、实体类继承BaseEntity

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

2、在系统管理设置角色

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

  • 全部数据权限
  • 自定数据权限
  • 部门数据权限
  • 部门及以下数据权限
  • 仅本人数据权限

3、添加@DataScope注解

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

注解参数说明

参数 类型 默认值 描述
deptAlias String 部门表的别名
userAlias String 用户表的别名

部门数据权限注解

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

例2:

<select id="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,那就要求拥有此角色的同时还得拥有相应的权限。

标签:...,RuoYi,若依,dept,user,注解,权限,id
From: https://www.cnblogs.com/kingwz/p/16923536.html

相关文章

  • 文件处理工具类-来自若依
    packagecom.ruoyi.common.utils.file;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importja......
  • 后台管理增删查改统一性代码--若依前后端分离版本
    controller:@PreAuthorize("@ss.hasPermi('system:role:list')")//和数据库中的menu中的字段有关系@GetMapping("list")publicTableDataInfolist(SysRolerole){start......
  • APP到底有没有权限-恶意拷贝删除照片
    作者:黑蛋近期发生了一件比较恶劣的事情,某客户在某物上面买了一件东西,但是这个东西是假货,所以客户致电某物人工客服,并进行了录音,这时候某物试图通过自身的客户端软件,去删除......
  • 12.jenkins RBAC权限管理
    在实际工作中,存在多个团队都需要Jenkins来实现持续交付,但是又希望不同团队之间进行隔离,每个项目有自己的view,只能看到自己项目的jenkinsjob.但是,jenkins默认的权限管理......
  • ESXi6.7如何新建用户与权限分配
    前言:对于新安装部署后的esxi系统,默认的用户只有root、dcui、xpxuser等系统自动生成的管理员账户,但是一般也几乎使用root账户进行登录,但是root用户权限太大,不小心的误操作将......
  • [第四篇]object c的访问权限和调用方法.
    公开的对象字段访问在外部调用使用​​obj->field​​如@publicintpublicField;默认的访问权限为​​protected​​只有自身和子类才可以访问,外部无法访问.设置权限......
  • 员工离职后,如何及时自动处理账号及权限?
    最近一则离职员工报复前东家的新闻引人注目。起因是该员工被公司辞退后怀恨在心,于是用自己的笔记本电脑入侵了前公司的服务器,进入了该公司的法国站、英国站、德国站三个亚马......
  • ubuntu vim中获取sudo权限保存
    有时在ubuntu下,用vim编辑了半天文本发现没有权限保存,这时可以用这种方式强制保存:w!sudotee%w保存!执行外部命令tee写入到文件%vim中的变量,当前文件地址,一般是......
  • Windows Server 2003 为用户“NT AUTHORITY/NETWORK SERVICE”授予的权限不足,无法执行
    在VISTA,Win7,Server2008操作系统里建立SQL报表时使用reportview访问报表时提示下面错误:为用户“NTAUTHORITY/NETWORKSERVICE”授予的权限不足,无法执行此操作。(rsAcc......
  • 自定义授权过滤器分配权限
    1.在用户登录时候获取用户的角色信息  2.创建一个类,继承Attribute,和IAuthorizationFilter ......