RuoYi-Cloud-Plus 数据权限
@DataColumn(key = “userName”, value = “u.user_id”)注解
src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@DataPermission({@DataColumn(key = "deptName", value = "d.dept_id"),@DataColumn(key = "userName", value = "u.user_id")})Page<SysUser> selectPageUserList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
src/main/java/com/ruoyi/common/mybatis/config/MybatisPlusConfiguration.java
/*** 数据权限拦截器*/public PlusDataPermissionInterceptor dataPermissionInterceptor() {return new PlusDataPermissionInterceptor();}
src/main/java/com/ruoyi/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
Overridepublic void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {// 检查忽略注解if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {return;}// 检查是否无效 无数据权限注解if (dataPermissionHandler.isInvalid(ms.getId())) {return;}// 解析 sql 分配对应方法PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);mpBs.sql(parserSingle(mpBs.sql(), ms.getId()));}@Overridepublic void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);MappedStatement ms = mpSh.mappedStatement();SqlCommandType sct = ms.getSqlCommandType();if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {return;}PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();mpBs.sql(parserMulti(mpBs.sql(), ms.getId()));}}
src/main/java/com/ruoyi/common/mybatis/enums/DataScopeType.java
需要拼入SysUserMapper中的数据权限
/*** 部门及以下数据权限*/DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", ""),
src/main/resources/mapper/system/SysUserMapper.xml
<select id="selectUserList" resultMap="SysUserResult">select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user uleft join sys_dept d on u.dept_id = d.dept_id${ew.getCustomSqlSegment}</select>
src/main/java/com/ruoyi/common/mybatis/annotation/DataColumn.java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataColumn {/*** 占位符关键字*/String[] key() default "deptName";/*** 占位符替换值*/String[] value() default "dept_id";}
@sdss.getDeptAndChild对应getDeptAndChild()方法返回值
src/main/java/com/ruoyi/system/dubbo/RemoteDataScopeServiceImpl.java#getDeptAndChild()
@Overridepublic String getDeptAndChild(Long deptId) {List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>().select(SysDept::getDeptId).apply(DataBaseHelper.findInSet(deptId, "ancestors")));List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);ids.add(deptId);List<SysDept> list = deptMapper.selectList(new LambdaQueryWrapper<SysDept>().select(SysDept::getDeptId).in(SysDept::getDeptId, ids));if (CollUtil.isNotEmpty(list)) {return StreamUtils.join(list, d -> Convert.toStr(d.getDeptId()));}return null;}
#user.deptId对应getSqlSegment()当前用户的部门id
src/main/java/com/ruoyi/common/mybatis/handler/PlusDataPermissionHandler.java
public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) {DataColumn[] dataColumns = findAnnotation(mappedStatementId);if (ArrayUtil.isEmpty(dataColumns)) {invalidCacheSet.add(mappedStatementId);return where;}LoginUser currentUser = DataPermissionHelper.getVariable("user");if (ObjectUtil.isNull(currentUser)) {currentUser = LoginHelper.getLoginUser();DataPermissionHelper.setVariable("user", currentUser);}// 如果是超级管理员,则不过滤数据if (ObjectUtil.isNull(currentUser) || LoginHelper.isAdmin(currentUser.getUserId())) {return where;}String dataFilterSql = buildDataFilter(dataColumns, isSelect);if (StringUtils.isBlank(dataFilterSql)) {return where;}try {Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql);// 数据权限使用单独的括号 防止与其他条件冲突Parenthesis parenthesis = new Parenthesis(expression);if (ObjectUtil.isNotNull(where)) {return new AndExpression(where, parenthesis);} else {return parenthesis;}} catch (JSQLParserException e) {throw new ServiceException("数据权限解析异常 => " + e.getMessage());}}
如果getDeptAndChild()方法返回值是1,2则SysUserMapper.xml的sql语句解析为
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader fromsys_user uleft join sys_dept d on u.dept_id = d.dept_idwhere d.dept_id IN(1,2)
RuoYi-Cloud-Plus 数据权限相关推荐
- sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...
Spring Cloud微服务架构中的数据权限DataPermision实现方案 一.出现原因 在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermis ...
- 基于ruoyi的数据权限设置
目录 一.代码修改 1.生成代码 2.代码修改 二.权限使用和测试 1.部门设置 三.测试 一.代码修改 基于ruoyi实现数据权限的话,首先需要一系列代码,既单表的增删改查 1.生成代码 用这个表来 ...
- ruoyi数据权限设置
目录 数据权限 数据权限,实现指定用户可以操作指定范围的数据.例如说,针对员工信息的数据权限: 用户 数据范围 普通员工 自己 部门领导 所属部门的所有员工 HR 小姐姐 整个公司的所有员工 上述的这 ...
- Ruoyi数据权限功能实现
若依实现数据实现实例 我们都知道,在一个系统中存在着不同的用户,而不同的用户在一个页面中所看到的数据是完全不一样的 而若依的数据权限是按照不同的部门进行实现的 我们先看普通用户的数据权限 可以看见他只 ...
- 若依框架使用数据权限
1.若依架构自带的数据权限为以下几种: 2.再功能模块给用户角色配置对应的数据权限如何让它生效 1)查看自己若依架构的 com.ruoyi.framework.aspectj. DataScopeAs ...
- springboot 数据权限_13 个最火的 SpringBoot 实战开源项目推荐!总有一个适合你!...
商城系统 Guide 哥注:下面的商城系统大多比较复杂比如 mall ,如果没有 Java 基础和 Spring Boot 都还没有摸熟的话不推荐过度研究下面几个项目或者使用这些项目当作毕业设计. m ...
- ruoyi cloud配置启动
1.配置nacos所用到的数据库 /* MySQL Data Transfer Source Host: localhost Source Database: ry-config Target Hos ...
- 【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏
开始前,请先完成圆梦宝典中宫格导航的开发,详见 [微信小程序-原生开发]实用教程 07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字) https://blog.csdn.net ...
- 实现权限控制_SpringCloud 微服务实现数据权限控制
前章讲了如何进行用户权限验证<SpringCloud下的用户鉴权方案>,它是微服务下统一资源访问权限的控制,就像一道墙保护着SpringCloud集群下的各个业务应用服务.而本章要讲的是权 ...
- 修改若依的数据权限功能
若依(cloud版本)的数据权限功能是通过注解实现的,在需要数据权限的方法上加上注解. 在注解中判断当前用户的角色对应的数据权限类型,在执行的sql语句后面拼接部门和用户的sql过滤条件从而实现数据权 ...
最新文章
- Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False
- docker设置国内镜像加速的坑
- python web框架django_Python Web应用框架 Django
- iPhone使用CoreTelephony获得SIM卡网络运营商资讯和通话资料
- cuda编程python接口_混合编程[python+cpp+cuda]
- 设计模式之 --- 工厂模式(下)
- 汇编指令-adr与ldr伪汇编区别(8)
- Java 注解(Java Annotation)
- c语言万年历查询程序代码,C语言实现万年历程序
- 计算机学院实习报告3000字(Java开发实习)--持续更新中,多个专业,以及版本
- ros中odometry数据生成方式与分发去向
- 前端实现搜索联想时防抖功能:
- 什么是系统时钟?什么是时钟系统?时钟系统有什么作用?
- AI挖掘优质淘宝买家秀 再也不用担心辣眼睛了
- Trajectory generation for quadrotor while tracking a moving target in cluttered environment
- MySQL--eq_range_index_dive_limit参数学习
- BUUCTF rsarsa
- 斐讯k3搭建nginx+php+MariaDB(mysql )的教程
- 面试常用mysql语句_50个常用的笔试、面试sql语句
- PAT B1032. 挖掘机技术哪家强 (20)