# 对象权限控制
# 基础权限控制
对于无复杂逻辑,与操作对象数据无关,只与其类型有关的权限控制逻辑,可以使用界面配 置方式。如果需要根据对象中的值,如某些字段的值结合当前用户的角色来决定某用户是否 可以操作某对象,则需要使用客制化开发的方式实现。
提示
以下内容仅作为系统工作方式的说明,在当前版本的系统中,对于对象的创建、修改操作,
无需直接配置 RequestMap 来控制权限,只需要配置对象表单中的 enable roles
字段,
即可实现权限控制。
以下参考内容供发生问题时,排查问题使用。
对象的权限控制默认情况下,根据该对象创建的 API 端口是否暴露给某角色而设定, 该设
定在 Request Map
中设定,以下的文档中,以对象DomainObject
为例,说明针对该类型
对象的相关权限配置。
# 查看权限
如果要赋予某角色 ROLE_A
该对象的查看权限,则需要在 Request Map 中插入如下记录
HttpMethod, Config Attribute, Url
GET,"ROLE_A",/
GET,"ROLE_A",/DomainObject/**
GET,"ROLE_A",/domain/DomainObject
GET,"ROLE_A",/DomainObject/**
2
3
4
5
# 创建权限
如果需要将其创建权限赋予某角色 ROLE_A
,则需要在 Request Map
对象中, 创建如下的相关记录:
HttpMethod: POST
Config Attribute: ROLE_A
Url: /DomainObject
2
3
# 编辑权限
如果需要将其编辑权限赋予某角色 ROLE_A
,则需要在 Request Map
对象中, 创建如下的相关记录:
HttpMethod: PUT
Config Attribute: ROLE_A
# 对于旧的已经弃用的 Grails 的 GORM 定义的 Domain Class,其 Url
Url: /DomainObject/**
2
3
4
# 删除权限
如果需要将其删除权限赋予某角色 ROLE_A
,则需要在 Request Map
对象中, 创建如下的相关记录:
HttpMethod: DELETE
Config Attribute: ROLE_A
Url: /DomainObject/**
2
3
# 动态权限
系统可以在运行时,根据对象的属性值,当前用户的角色等信息,动态的判断用户是否有权 创建、修改、删除某个对象,定制方式详述如下。
# 动态创建权限
对于对象动态创建权限的判断,需要创建的如下的Dynamic Object Hook
对象
Hook Type: 选择 Object create ability
Object Type: 选择该客制化逻辑适用的对象类型
Core Logic: 选择具体的判断实现逻辑
2
3
# 注入变量
可以使用的注入变量如下表所示:
变量名称 | 变量类型 | 描述 |
---|---|---|
objectType | Class<?> | 当前操作的对象类型 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
客制化代码需要返回一个 Map<String, Boolean>
对象,该对象包含一个 key 为 create
的元素,示例如下:
// 本行代码返回允许用户创建该对象
// Allow user to create this object
return ['create': true]
2
# 动态修改和删除权限
对于对象动态修改和删除权限的判断,需要创建如下的 Dynamic Object Hook
对象
Hook Type: 选择 Update/delete ability
Object Type: 选择该客制化逻辑适用的对象类型
Core Logic: 选择具体的判断实现逻辑
2
3
和对应的 Dynamic Object Hook 对象
# 注入变量
客制化代码中,可以使用的注入变量如下表所示:
变量名称 | 变量类型 | 描述 |
---|---|---|
objectType | Class<?> | 当前操作的对象类型 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
objectValue | grails.core.GrailsDomainClass | 请使用 object 参数 已弃用 |
object | grails.core.GrailsDomainClass | 当前操作的对象,类型为当前操作对象的类型 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
客制化代码需要返回一个 Map<String, Boolean>
对象,该对象包含 key 为 update
和 delete
的元素,示例如下:
//返回允许用户更新该对象,但不允许用户删除该对象
//Allow user to update this object, but not allow user to delete this object
return [
result: [
'update': true,
'delete': false
]
]
2
3
4
5
6
7