下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据权限方案设计权限控制主要分为两块,认证(Authentication)与授权(Authorization)。认证之后确认了身份正确,业务系统就会进行授权,现在业界比较流行的模型就是RBAC(Role-Based Access Control)。RBAC包含为下面四个要素:用户、角色、权限、资源。用户是源头,资源是目标,用户绑定至角色,资源与权限关联,最终将角色与权限关联,就形成了比较完整灵活的权限控制模型。资源是最终需要控制的标的物,但是我们在一个业务系统中要将哪些元素作为待控制的资源呢?我将系统中待控制的资源分为三类:1. URL访问资源(接口以及网页)2. 界面元素资源(增删改查导入导
2、出的按钮,重要的业务数据展示与否等)3. 数据资源现在业内普遍的实现方案实际上很粗放,就是单纯的“菜单控制”,通过菜单显示与否来达到控制权限的目的。平台分为To C和To B两种:1. To C一般不会有太多的复杂权限控制,甚至大部分连菜单控制都不用,全部都可以访问。2. To B一般都不是开放的,只要做好认证关口,能够进入系统的只有内部员工。大部分企业内部的员工互联网知识有限,而且作为内部员工不敢对系统进行破坏性的尝试。所以针对现在的情况,考虑成本与产出,大部分设计者也不愿意在权限上进行太多的研发力量。菜单和界面元素一般都是由前端编码配合存储数据实现,URL访问资源的控制也有一些框架比如Sp
3、ringSecurity,Shiro。目前还没有数据权限控制的框架或者方法,所以自己整理了一份。1、数据权限控制原理数据权限控制最终的效果是会要求在同一个数据请求方法中,根据不同的权限返回不同的数据集,而且无需并且不能由研发编码控制。这样大家的第一想法应该就是AOP,拦截所有的底层方法,加入过滤条件。这样的方式兼容性较强,但是复杂程度也会更高。我们这套系统中,采用的是利用Mybatis的plugin机制,在底层SQL解析时替换增加过滤条件。这样一套控制机制存在很明显的优缺点,首先缺点:1. 适用性有限,基于底层的Mybatis。2. 方言有限,针对了某种数据库(我们使用Mysql),而且由于需
4、要在底层解析处理条件所以有可能造成不同的数据库不能兼容。当然Redis和NoSQL也无法限制。当然,假如你现在就用Mybatis,而且数据库使用的是Mysql,这方面就没有太大影响了。接下来说说优点:1. 减少了接口数量及接口复杂度。原本针对不同的角色,可能会区分不同的接口或者在接口实现时利用流程控制逻辑来区分不同的条件。有了数据权限控制,代码中只用写基本逻辑,权限过滤由底层机制自动处理。2. 提高了数据权限控制的灵活性。例如原本只有主管能查本部门下组织架构/订单数据,现在新增助理角色,能够查询本部门下组织架构,不能查询订单。这样的话普通的写法就需要调整逻辑控制,使用数据权限控制的话,直接修改
5、配置就好。2、数据权限实现上一节就提及了实现原理,是基于Mybatis的plugins(查看官方文档)实现。MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, ha
6、ndleOutputParameters)StatementHandler (prepare, parameterize, batch, update, query)Mybatis的插件机制目前比较出名的实现应该就是PageHelper项目了,在做这个实现的时候也参考了PageHelper项目的实现方式。所以权限控制插件的类命名为PermissionHelper。机制是依托于Mybatis的plugins机制,实际SQL处理的时候基于jsqlparser这个包。设计中包含两个类,一个是保存角色与权限的实体类命名为PermissionRule,一个是根据实体变更底层SQL语句的主体方法类Perm
7、issionHelper。数据结构中保存如下几个字段:· 角色列表:需要使用此规则的角色,可以多个,使用英文逗号隔开。· 实体列表:对应的规则应用的实体(这里指的是表结构中的表名,可能你的实体是驼峰而数据库是蛇形,所以这里要放蛇形那个),可以多个,使用英文逗号隔开。· 表达式:表达式就是数据权限控制的核心了。简单的说这里的表达式就是一段SQL语句,其中设置了一些可替换值,底层会用对应运行时的变量替换对应内容,从而达到增加条件的效果。· 规则说明:单纯的一个说明字段。核心流程系统启动时,首先从数据库加载出所有的规则。底层利用插件机制来拦截所有的查询语句,进
8、入查询拦截方法后,首先根据当前用户的权限列表筛选出PermissionRule列表,然后循环列表中的规则,对语句中符合实体列表的表进行条件增加,最终生成处理后的SQL语句,退出拦截器,Mybatis执行处理后SQL并返回结果。头部只是标准的Mybatis拦截器写法,注解中的Signature决定了你的代码对哪些方法拦截,update实际上针对修改(Update)、删除(Delete)生效,query是对查询(Select)生效。重点思路重点其实就在于Sql的解析和条件注入,使用开源项目JSqlParser。· 解析出MainTable和JoinTable。from之后跟着的称为Mai
9、nTable,join之后跟着的称为JoinTable。这两个就是我们PermissionRule需要匹配的表名,PermissionRule:fromEntity字段。· 解析出MainTable的where和JoinTable的on后面的条件。使用and连接原本的条件和待注入的条件,PermissionRule:exps字段。· 使用当前登录的用户信息(放在缓存中),替换条件表达式中的值。· 某些情况需要忽略权限,可以考虑使用ThreadLocal(单机)/Redis(集群)来控制3、使用1、数据准别:a、创建数据库,储存权限规则,表为permission_r
10、uleb、用户登录时,到数据库查询用户拥有角色所拥有的permission_rule,将其设置返回前端储存c、前端每次发送请求时,携带pemission_rule的信息2、定义数据权限插件a、仿照PageHelper的工作原理,创建PermissionHelper,定义权限开关方法startData (),开始权限拦截b、拦截器拦截sql,判断是否开始拦截,开始拦截,按照rule规则,拦截并拼接sql3、定义PermissionHelper的使用开关因startData()是静态方法,只能操作静态成员变量,在并发时会有安全问题,步骤如下:a、使用ThreadLocal作为全局变量,存储当前线程
11、的变量b、引入json,将Permission_rule格式化成字符串,再在PermissionHelper中解析成LIstc、在需要数据权限的地方使用PermissionHelper.startData(header),参数为前端传回的登录用户信息d、因PermissionHelper在utils工程,方便其他工程引用,所以在header不能直接传,采用json字符串来传e、PermissionHelper实现了Mybatis的 Interceptor接口,并且拦截perpare方法,才能对sql进行操作并返回给mybatis去执行(拦截query方法无效)f、PermissionHelpe
12、r对是否需要数据权限进行判断,此变量放在了TreadLocal中,有且仅有当前线程能访问g、对header的json字符串进行解析,有权限规则Listh、对权限规则list进行遍历,按主表、从表的顺序进行匹配规则、替换变量i、返回sql,给mybatis执行h、执行完需关闭权限控制开关4、用法1、引maven坐标<dependency> <groupId>com.auth</groupId> <artifactId>ac-framework-utils</artifactId> <version>1.0-SNAPSHOT&
13、lt;/version></dependency>2、编写权限规则在permission_rule表中编写权限规则,各字段解释如下:Name: 规则名称Ids :适用角色id列表,格式如:1,2,(用逗号隔开)Main_tables :适用的主表,格式如: Role,User, (用逗号隔开)Exps :过滤表达式字段,uid 会自动替换为当前用户的userId,me 主实体名称me.a 主实体别名格式如:userId = uid(userId = uid AND authType > 3)(userId = uid AND authType) > 3 OR (dept in (select dept from depts where manager.id = uid)4、将controller中的request解析出用户信息,如下所示/当前登录用户信息AcOauth2Util acOauth2Util=new AcOauth2Util();AcOauth2Util.UserJwt userJwtFromHeader = acOauth2Util.getUserJ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专属2024法务服务协议模板版B版
- 2025年度健康养老产业地产合作投资协议书模板4篇
- 科技赋能社团管理
- 专业能源管理服务协议标准格式书版
- 业务员与公司的合作协议书
- 专业美甲教学合作协议书(2024年版)
- 专业油漆施工协议2024年版详则版B版
- 2025年度茶叶行业培训与职业资格认证合同4篇
- 2024知识产权保护及保密协议范本下载
- 海南省安全员C证理论考试试题
- 医疗护理员五级理论知识考核试题
- 法院执行议价协议书模板
- 多感官交互对文化参与的影响
- 2024至2030年中国家庭维修行业发展前景预测及投资策略研究报告
- 文化旅游场所运营设备更新项目资金申请报告-超长期特别国债投资专项
- 【人教版】二年级数学上册说课稿-第2课时 直角的认识
- JTG F40-2004 公路沥青路面施工技术规范
- 成都市2022级(2025届)高中毕业班摸底测试(零诊)英语试卷(含答案)
- 江苏省南京市玄武区2022-2023学年七年级下学期期末语文试题
- 《金属非金属地下矿山监测监控系统建设规范》
- 房建EPC项目施工部署及-物资、机械设备、劳动力投入计划
评论
0/150
提交评论