权限使用原创
# 权限使用
提示
以下的权限都是指数据权限,资源权限是通过配置角色,对角色指定资源来实现!
# 概要
数据权限是针对执行SQL的拦截及追加,最终达到数据过滤的目的,snapper系统的权限对SQL的过滤主要包含两个信息即用户委托和组织委托 同时还建议添加几个通用的审计字段,因此要实现数据权限需要在对应的表上添加对应的字段(也可以不添加,通过配置时指定)
- create_user 操作人字段,在保存时系统会自动填充当前操作人的账号,注意只在保存(insert)时填充,只填充一次,更新时不会修改
- group_id 操作人的部门,在保存时系统会自动填充当前操作人的部门,同create_user相同,只是在保存(insert)时填充,如果用户有多个部门,在登录时需明确部门
- create_time 创建时间字段,在保存时会自动填充当前时间(timestamp)
- update_user 更新人字典,在保存和更新时会自动更新,存储当前操作的用户账号
- update_time 更新时间,在保存和更新时会自动更新当前的时间(timestamp)
- create_user_cn_name 创建人中文名,在保存时自动填充当前操作人的中文名
- update_user_cn_name 更新人中文名,在保存或更新时自动填充当前操作人的中文名
# 权限范围
系统中定义权限范围分为以下几种:
- 用户权限范围 关联列create_user列,表示当前用户相关的权限范围
- 组织权限范围 关联列group_id列,表示当前用户组织相关的权限范围
- 公司权限范围 关联列group_id,为保证数据的安全线,默认总是过滤分公司数据(group_id表示分公司的数据)
组织树参考:
# 使用方式
snapper的数据权限使用包含两种方式(扩展点)
- 注解式扩展点 通过在方法上进行注解配置,实现静态的权限功能过滤(@Action 和 @ActionConnect)
- 编程式扩展点 通过对应的上下文工具,在运行时动态指定(PermContext)
# 注解式扩展点
系统提供以下注解来进行权限的配置
- @Action 将功能与权限关联,其值为在添加按钮时绑定的业务权限Action
- @ActionConnect 将权限与mapper执行方法绑定,即指定执行那个mapper方法需要进行权限过滤
警告
为保证总是能够看到自己创建的数据,此处即使用户列指定为别的列,默认也会追加crate_user列,如果确实要忽略create_user,请配置beAlwaysFilterCreateUserColumn 为false,或在PermContext中设置withIgnoreCreateUserColumn
其中用户列默认为create_user列,可以指定为其他列,组织列默认为group_id,可以指定为其他列
一个典型的配置例子为:
@Action(value = "ORDER_SEARCH")
@ActionConnect(
value = {"selectList","selectCount"},
userAuthColumn= {UserTag.SERVICE + Strings.HASH + "service_code", UserTag.SALLER + Strings.HASH + "seller_code"},
groupAuthColumn = {UserTag.SERVICE + Strings.HASH + "service_code", UserTag.SALLER + Strings.HASH + "seller_code"}
)
说明如下
- Action 关联的为ORDER_SEACH 业务权限,此业务权限会与按钮功能一对一进行关联,在界面UI中的菜单关联->按钮中指定
- ActionConnect 指定对OrderMapper(假设添加权限注解的service中关联了OrderMapper,如何关联请参考项目使用)中的selectList、selectCount方法进行过滤
- 用户列(create_user)过滤规则 当用户的tag为SERVICE时过滤的用户列为service_code,当用户的tag为SALLER时过滤的用户列为seller_code
- 组织列(group_id)过滤规则 当用户的tag为SERVICE时过滤的组织列为service_code,当用户的tag为SALLER时过滤的用户列为seller_code
- groupAuthColumn指定列为service_code,seller_code时(不是group_id列),数据存储格式应该为"当前用户的groupid#当前用户的账号”(例:R0101#frog)
# 编程式扩展点
系统编程式扩展点时为解决权限依赖的数据在运行时可见,此时不同的运行状态对应的数据不同,无法通过注解式来静态指定
- PermContext 是系统上下文中的一种,提供一系列的方法进行实时绑定权限上下文
# 用户标签
提示
用户标签是连接用户与数据权限的纽带,自定义标签能够实时动态的配置用户数据权限
- 用户标签(tag)又为"用户业务标签" 是为满足某些业务场景自定义的字典数据,对应的字典父编码为USER_BUSINESS_TAG,可以通过界面的字典管理功能在父字典下根据需求追加对应的用户业务标签,
- 在用户管理中对用户设置对应的用户属性(业务标签),此时这些用户与业务标签绑定
- 在注解扩展点中可以根据用户标签来配置权限,这样可以动态的进行换标签实时改变对应的数据权限,达到灵活配置实时渲染的目的。
# 扩展点@Action信息
属性 | 说明 |
---|---|
value | 对应业务权限定义,每个功能按钮对应一个业务权限定义,具体参考按钮定义 |
ignoreUserScope | 设置是否忽略用户权限范围,默认为false,如果为true则忽略用户权限范围 |
ignoreGroupScope | 设置是否忽略组织权限范围,默认为false,如果为true则忽略组织权限范围 |
ignoreCompanyScopeTags | 只过滤公司的用户标签,可以配置多个 |
onlyFilterCompanyTags | 设置是否忽略公司权限范围,默认为false,如果为true则忽略公司权限范围,此时会自动忽略用户权限范围和组织权限范围 |
# 扩展点@ActionConnect信息
属性 | 说明 |
---|---|
value | 对应执行的Mapper(mybatis的mapper方法名, 可包含多个 |
userAuthColumn | 指定用户权限范围列的列名,默认为create_user,可配置多个.支持tag1#column1,tag2#column2的格式,其中tag为用户标签,column为列名 |
groupAuthColumn | 指定组织权限范围列的列值,默认为group_id,可配置多个.支持tag1#value1,tag2#value2的格式,其中tag为用户标签,value为列值 |
ignoreUserScopeTags | 忽略用户权限范围标签,可配置多个. |
ignoreGroupScopeTags | 忽略组织权限范围标签,可配置多个. |
beAlwaysFilterUpdateUserColumn | 是否总是过滤update_user列,默认为true,即默认只能看到自己的数据(ignoreUserScope为false情况下) |
tableNameWithAuthInject | 数据权限SQL插入位置(表名同级),即与配置表明同级位置插入WHERE条件,如果该值为空,则会放在最外层 |
tableNameWithColumnInject | 列权限SQL插入位置(表名同级),即与配置表明同级位置分析列权限 |