首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据权限管理中心

由于公司大部分项目都是使用mybatis,也是使用mybatis的拦截器进行分页处理,所以技术上也直接选择从拦截器入手

需求场景

第一种场景:行级数据处理

原sql:

需要封装成:

解释

用户只能查询当前所属市以及下属地市数据

其中 like 部分也可以为动态参数(下面会讲到)

此场景还有以下情况:

第二种场景:列级数据处理

原sql:

用户A可以看到 id,username,region

用户B只能查看 id,username 的值,region的值没有权限查看。

应用流程图

应用链路逻辑图

技术实现

mybatis拦截器

在编写mybatis的拦截器之前,我们先来了解下mybaits的拦截目标方法

1、Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

2、ParameterHandler (getParameterObject, setParameters)

3、StatementHandler (prepare, parameterize, batch, update, query)

4、ResultSetHandler (handleResultSets, handleOutputParameters)

这里选择StatementHandler 的prepare方法作为sql执行之前的拦截进行sql封装,使用ResultSetHandler 的handleResultSets方法作为sql执行之后的结果拦截过滤。

sql执行前

sql执行后

其中 为 dao 层自定义切面,用于开关控制是否启用数据权限过滤。

难点

如何在拦截器获取dao层注解内容;

如何获取当前登录人标识;

如何传递动态参数;

需要考虑到与sql分页的优先级。

解答

拦截器获取dao层注解

不同方法的拦截器获取方法稍微有所区别,具体在上面的 与 代码中自行查看。

获取当前登录人标识

由于不同框架或者不同项目,获取当天登录人的方法可能不一样,那么就只能通过配置的方式动态将传递给权限中心。

配置文件中添加:

然后利用Java反射机制,触发getUserId( )方法。

传递动态参数

比如用户A只能查询自己单位以及下属单位的所有数据;

配置中心配置的where部分的sql如下:

然后通过读取到以上sql,并且通过数据库或者配置文件中设置的参数【orgCd】相关联的方法(类似的方式),提前在权限参数(orgCd)配置好对应的方法路径、参数值类型、返回值类型等。

配置文件或者数据库获取到 orgCd 对应的方法路径:

当然,现在这样只是简单的动态参数,其余的还需要后续的开发,这里只是最简单的尝试。

拓展

从产品的角度来说,此模块需要有三个部分组成:

1、foruo-permission-admin 数据权限管理平台

2、foruo-permission-server 数据权限服务端(提供权限相关接口)

3、foruo-permission-client 数据权限客户端(封装API)

在结合 即可完成此模块内容。

涉及知识点:

Mybatis拦截器

Java反射机制

项目源码

码云:https://gitee.com/gmarshal/foruo-sc-permission

博客:https://my.oschina.net/gmarshal/blog/1797026

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180417G1UDF800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券