@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 数据权限相关推荐

  1. sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...

    Spring Cloud微服务架构中的数据权限DataPermision实现方案 一.出现原因 在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermis ...

  2. 基于ruoyi的数据权限设置

    目录 一.代码修改 1.生成代码 2.代码修改 二.权限使用和测试 1.部门设置 三.测试 一.代码修改 基于ruoyi实现数据权限的话,首先需要一系列代码,既单表的增删改查 1.生成代码 用这个表来 ...

  3. ruoyi数据权限设置

    目录 数据权限 数据权限,实现指定用户可以操作指定范围的数据.例如说,针对员工信息的数据权限: 用户 数据范围 普通员工 自己 部门领导 所属部门的所有员工 HR 小姐姐 整个公司的所有员工 上述的这 ...

  4. Ruoyi数据权限功能实现

    若依实现数据实现实例 我们都知道,在一个系统中存在着不同的用户,而不同的用户在一个页面中所看到的数据是完全不一样的 而若依的数据权限是按照不同的部门进行实现的 我们先看普通用户的数据权限 可以看见他只 ...

  5. 若依框架使用数据权限

    1.若依架构自带的数据权限为以下几种: 2.再功能模块给用户角色配置对应的数据权限如何让它生效 1)查看自己若依架构的 com.ruoyi.framework.aspectj. DataScopeAs ...

  6. springboot 数据权限_13 个最火的 SpringBoot 实战开源项目推荐!总有一个适合你!...

    商城系统 Guide 哥注:下面的商城系统大多比较复杂比如 mall ,如果没有 Java 基础和 Spring Boot 都还没有摸熟的话不推荐过度研究下面几个项目或者使用这些项目当作毕业设计. m ...

  7. ruoyi cloud配置启动

    1.配置nacos所用到的数据库 /* MySQL Data Transfer Source Host: localhost Source Database: ry-config Target Hos ...

  8. 【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏

    开始前,请先完成圆梦宝典中宫格导航的开发,详见 [微信小程序-原生开发]实用教程 07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字) https://blog.csdn.net ...

  9. 实现权限控制_SpringCloud 微服务实现数据权限控制

    前章讲了如何进行用户权限验证<SpringCloud下的用户鉴权方案>,它是微服务下统一资源访问权限的控制,就像一道墙保护着SpringCloud集群下的各个业务应用服务.而本章要讲的是权 ...

  10. 修改若依的数据权限功能

    若依(cloud版本)的数据权限功能是通过注解实现的,在需要数据权限的方法上加上注解. 在注解中判断当前用户的角色对应的数据权限类型,在执行的sql语句后面拼接部门和用户的sql过滤条件从而实现数据权 ...

最新文章

  1. mysql批量创建数据库 导数据
  2. 第二阶段冲刺--团队站立会议03
  3. 引领潮流云电视机遇与挑战并现
  4. Eclipse 各种快捷键
  5. ffmpeg参数中文详细解释
  6. hive插件 ranger_Apache Ranger及Hive权限控制
  7. mysql建立索引的优缺点|创建索引alter或create索引分类(PRIMARY KEY,UNIQUE KEY,FULLTEXT,INDEX)作用查看索引show index from table
  8. 文本分类——NaiveBayes
  9. Java在线聊天室(客户端+服务器)
  10. 基于FPGA的卷积神经网络加速器_余子健
  11. 路由、路由表介绍以及静态路由的配置
  12. 一个人靠不靠谱,就看这三点: 凡事有交代,件件有着落,事事有回音
  13. 深入浅出matplotlib(101):研究最有名的滤波函数:sinc函数
  14. 目标检测算法之AAAI2019 Oral论文GHM Loss
  15. 有位程序员写了部「修仙小说版」编程教程!网友:蚌埠住了 ....
  16. 山海演武传·黄道·第二卷 大风起兮 第二 ~ 三章 傲娇的赤龙皇女
  17. c语言:递归求学生年龄问题
  18. Rodney Brooks: 我们需要更理性看待人工智能技术
  19. 如何安全的存储用户密码
  20. 指定SpringBoot内嵌Tomcat的版本,修复(CVE-2021-42340)漏洞

热门文章

  1. 深入理解Nginx:在一家公司干多长时间跳槽才合适吐血整理
  2. Latex+WinDet联立公式编号及一行多图片写法
  3. WPScan使用方法
  4. 师徒计划--程序员在小公司的成长历程
  5. 基于三角剖分的 face swap, 三角剖分,映射贴图
  6. 【解决方案】如何通过EasyCVR智能边缘网关设备实现前端设备利旧上云,打造AI课程智慧应用
  7. 腾讯微信事业群简单一面
  8. 喜树碱-聚乙二醇-聚丙烯酸 CPT-PEG-PAA 喜树碱-聚丙烯酸叔丁酯 CPT-PtBA
  9. jboss jpa 配置使用
  10. 入门的编程之路(二)pycharm社区版跟专业版的区别?