在开发应用系统时,都离不开权限的设计,权限设计 = 功能权限 + 数据权限。而功能权限,在业界常常是基于RBAC(Role-Based Access Control)的一套方案。而数据权限,则根据不同的业务场景,则权限设计不尽相同,可以有不同的技术解决方案。按照应用系统权限类型划分,可进一步细分为菜单权限、按钮权限、字段权限、接口权限、数据行权限、数据列权限、登录权限等。本文重点讲数据权限管理,尤其是数据行级权限的控制与管理。
数据权限是一种重要的数据安全措施,它可以帮助组织机构保护敏感数据并确保不同用户只能访问他们被授权的数据。数据权限分数据行权限和数据列权限两种。
数据行权限是一种数据权限类型,它控制用户能够访问和操作的数据行的级别。行级权限通常是指对特定数据行的访问和操作权限。例如,在一个销售订单管理系统中,销售人员可能只能查看或编辑自己的销售订单,而部门经理则可以查看或编辑整个部门的销售订单。这种权限控制确保了不同用户只能访问和操作他们被授权的数据行。
数据列权限则是指对特定数据列的访问权限。例如,在一个包含客户信息的表中,某些用户可能只能查看客户的姓名和联系方式,而其他用户则可以查看客户的详细地址和银行账户信息。这种权限控制确保了不同用户只能访问他们被授权的列。
应用系统的数据行权限实现通常依赖于以下方法之一或多种组合:
1.?数据库级别的权限控制
- 行级安全策略(RLS):使用数据库管理系统提供的行级安全策略功能。例如,PostgreSQL 的 RLS 允许在表上定义访问规则,控制用户对特定行的访问。
- 数据库视图:创建视图,仅显示符合用户权限的数据行。通过限制视图中的数据内容,控制用户能够看到的数据。
2. 用户角色和权限管理
- 角色分配:将用户分配到不同的角色,并为每个角色分配特定的行级权限。这样可以通过管理角色的权限来控制用户对数据行的访问。
- 动态权限分配:在应用程序中动态地分配和管理用户权限,根据用户的身份或其他属性,决定其对数据行的访问权限。
?3. 自定义应用逻辑
- 业务逻辑控制:在应用程序中编写自定义逻辑来控制数据行的访问。这可能涉及特定的权限检查、过滤器或拦截器来确保用户只能访问其有权限的数据行。
4. 标签/标记级别的安全策略
- 数据标签化和标记化:为数据行分配标签或标记,并在应用程序中根据用户的标签或标记来控制其访问权限。只有匹配标签的用户才能访问特定的数据行。
5. 数据加密和解密
- 数据加密技术: 对敏感数据行进行加密,并通过密钥管理系统控制用户对加密数据行的访问权限。
实施注意事项:
- 权限设计与维护: 设计清晰的权限结构,并定期审查和更新权限设置,以确保安全性。
- 安全审计和监控:记录和监控用户对数据行的访问情况,以便及时发现异常活动并采取措施。
- 性能优化:行级权限控制可能会对系统性能产生一定影响。因此,在设计和实施时需考虑优化方法,以减少对系统性能的负面影响。
选择合适的实现方法取决于应用系统的需求、数据库技术、安全要求和性能考量。通常,结合不同的方法可以更好地满足特定情况下的权限需求。
采用上文中“三、数据权限有哪些技术方案”的第2条和第3条组合实现,即“基于角色的动态权限分配” +“自定义应用逻辑”实现数据行级权限的控制。
这个方案最核心的地方就是数据权限策略的设计了,抽象出来概念如下:
以下是数据权限的数据库ER模型设计:
在这个ER模型中,用户表、角色表是主体,资源表存放的是资源(比如:菜单、按钮、接口等),数据权限规则表存放是规则定义,而规则定义又跟资源有关系。主体、资源和规则如何发生关系呢,通过角色-资源-规则关系表进行统一管理,该表相当于是数据权限生效的条件定义表了。
数据行级权限技术方案核心如何配置行级权限配置和数据查询控制,基于角色的动态数据权限控制实现逻辑如下:
(1)数据权限规则定义:比如,查看自己创建的数据;查看本部门所有员工创建的数据;查看订单销售金额大于10000的数据,等等。这些都是数据权限规则的定义,有些规则具备通用性,可以提前抽取出来,有的规则跟业务有紧耦合关系,只能提供管理功能,让客户自己定义和管理。
(2)数据权限角色分配:首先,需要对用户和角色进行管理。每个用户只能访问其角色对应的行级数据。管理员可以根据业务需求设置不同的角色,并为每个角色分配相应的权限。
(3)数据权限执行控制:在用户查询数据时,系统会根据用户的角色和权限进行行级权限控制。系统会根据用户的角色和权限,查询数据规则定义表,动态生成相应的SQL查询语句,从而只返回用户有权访问的数据行,简单讲就是动态拼接Select SQL语句,每个人查询时执行的SQL都是动态生成的。
?数据权限定义后,业务模块每次访问都会去请求验证权限,所以查询数据权限的规则需要高效,可以利用redis等缓存服务把数据权限规则缓存起来,避免每次请求时查询数据库。
另外,数据查询控制是通过SQL语句的where条件实现的,要尽量避免复杂的、多表关联查询,避免全表扫描的情况发生,合理的设置数据库索引,来提升查询效率。
云程低代码开发平台设计了严格的权限控制策略,支持菜单权限、按钮权限、字段权限、接口权限、数据行权限、数据列权限、登录权限等多个维度的细粒度权限控制,且提供了可视化配置界面,系统管理员可进行灵活的权限配置和控制。以下重点介绍数据行权限的设计和应用效果。
(1)数据权限定义
平台提供了数据权限配置功能,可在线配置和启停数据权限。在需要控制数据权限的Java类的方法上增加@PermissionData注解,这里录入的数据权限标识需要与@PermissionData注解的值保持一致,即“system:SysUser:list”。
(2)权限规则定义
系统内置了一些常用数据规则,支持开箱即用,包括:
如果要自定义其他数据规则,可以在菜单管理模块,找到添加的数据权限节点,点击后面的数据规则按钮,配置自定义的数据规则。
比如:数据权限规则配置(只看性别为男的用户)。
【规则名称】:写有业务含义的描述
【规则字段】:使用实体字段名
【条件规则】:大于/大于等于/小于/小于等于/等于/包含/模糊/不等于/自定义SQL
【规则值】:指定值 ( 固定值/系统上下文变量 ),变量配置格式为#{变量名}。
(3)数据权限分配
数据权限规则定义完成后,把规则分配给相应的角色即可。进入角色授权菜单,选中对应的角色,点击需要控制数据权限的菜单后方的标记,打开数据权限规则界面。在数据权限规则界面里,可以看到刚刚配置的数据规则,可以按照数据权限控制需求,打勾对应的规则并保持数据权限。
(4)数据权限控制效果
直接查询数据库表的数据有15条,创建者为admin的数据有6条。
SELECT username,realname,sex,phone,email,create_by FROM `sys_user`
通过admin账号登录后,查看用户管理模块,只能看到自己创建的数据了,说明数据权限已经生效。
在线免费体验:http://www.yunchengxc.com