数据权限设计(原创)
Posted CODE阿宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据权限设计(原创)相关的知识,希望对你有一定的参考价值。
数据权限是针对数据表中行级和列级的控制,相对操作权限,颗粒度更细,复杂度更高,因为在项目中也有相关需求,是直接通过硬编码sql查询条件控制的,
后期维护起来比较困难。所以有了一些想法,后期也将在本人springBoot框架中实现。下面细说下我的一些想法:
一、行级权限(数据范围)
1、应用场景:部门查询范围、区域查询范围、只能查看本人订单等
2、实现方式:一般只能通过where条件去控制,但通过硬编码方式,灵活度和维护度不高,建议通过按角色增加数据权限,达到和功能权限统一
3、具体实现(操作建议开发人员或DB人员维护)
建一个行级权限范围控制表 userId(用户id)、sql_id(mapper方法名)、type(控制类型:1-本部门 2-包含下级部门 3-本用户)、isUsed(是否使用)、otherWhere(其他条件语句可添加其他字段的范围)
功能实现:在用户页面添加按钮数据权限,双选项卡(行级数据、列级数据)、行级数据录入上述表中的字段
本人用的mybatis,使用拦截器拦截到sql,首先判断行级权限是否启用,判断sqlId是否匹配。判断类型,本部门则查询登陆用户所属部门,
包含下级部门则需要使用递归,本用户则查询当前登陆用户的(这里建议设计所有表都有这个字段create_user,这样才能按部门或用户控制表数据)
如果otherWhere不为空,则继续追加这个查询条件
二、列级权限
1、应用场景:价格字段、身份证号、密码等敏感字段
2、实现方式:页面循环列控制显示,比如jqgrid、datatables等,都是循环cols,在循环时通过标签控制,标签判断如果为true,则显示该标签包含内容,反之,不显示
3、功能实现:
同样,先建一个列级权限范围控制表userId(用户id)、table_id(页面tableId),type(控制类型:1-本部门 2-包含下级部门 3-本用户)、isUsed(是否使用),hideCols(配置隐藏的列,和dataTables的columns字段相同,可用逗号分割)
在用户数据权限的“列级数据”选项卡,先选定按部门、含下级部门、用户,录入多个隐藏的列用逗号分隔,注意id不能隐藏,保存
页面表格列控制,本人这里使用的是shiro权限框架,前端用的thymeleaf+datatablse, 所以用直接用shiro自定义标签(其它可用自定义标签实现),标签功能传参table_id,col_id,根据登陆用户id、table_id、col_id,isUsed=1查询 count>0返回false,col不显示
补充:上述建的行级控制和列级控制两张配置表可放到redis缓存中,提高查询性能
通过这种方式,可先只做功能权限,不考虑数据权限,如果有客户需求,可通过需求进行配置开发,这样改动的代码量相对较小,而且通过拦截器实现的,不影响整个后台的逻辑代码,而且便于后期的统一维护和更改
这里只是目前本人的实现思路,如大家有更好的实现方式,可分享,跟大家一起进步~~~
以上是关于数据权限设计(原创)的主要内容,如果未能解决你的问题,请参考以下文章