# 对象权限控制

# 基础权限控制

对于无复杂逻辑,与操作对象数据无关,只与其类型有关的权限控制逻辑,可以使用界面配 置方式。如果需要根据对象中的值,如某些字段的值结合当前用户的角色来决定某用户是否 可以操作某对象,则需要使用客制化开发的方式实现。

提示

以下内容仅作为系统工作方式的说明,在当前版本的系统中,对于对象的创建、修改操作, 无需直接配置 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/**
1
2
3
4
5

# 创建权限

如果需要将其创建权限赋予某角色 ROLE_A,则需要在 Request Map对象中, 创建如下的相关记录:

HttpMethod: POST
Config Attribute: ROLE_A
Url: /DomainObject
1
2
3

# 编辑权限

如果需要将其编辑权限赋予某角色 ROLE_A,则需要在 Request Map对象中, 创建如下的相关记录:

HttpMethod: PUT
Config Attribute: ROLE_A
# 对于旧的已经弃用的 Grails 的 GORM 定义的 Domain Class,其 Url
Url: /DomainObject/**
1
2
3
4

# 删除权限

如果需要将其删除权限赋予某角色 ROLE_A,则需要在 Request Map对象中, 创建如下的相关记录:

HttpMethod: DELETE
Config Attribute: ROLE_A
Url: /DomainObject/**
1
2
3

# 动态权限

系统可以在运行时,根据对象的属性值,当前用户的角色等信息,动态的判断用户是否有权 创建、修改、删除某个对象,定制方式详述如下。

# 动态创建权限

对于对象动态创建权限的判断,需要创建的如下的Dynamic Object Hook 对象

Hook Type: 选择 Object create ability 
Object Type: 选择该客制化逻辑适用的对象类型
Core Logic: 选择具体的判断实现逻辑
1
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] 
1
2

# 动态修改和删除权限

对于对象动态修改和删除权限的判断,需要创建如下的 Dynamic Object Hook 对象

Hook Type: 选择 Update/delete ability 
Object Type: 选择该客制化逻辑适用的对象类型
Core Logic: 选择具体的判断实现逻辑
1
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 为 updatedelete 的元素,示例如下:

//返回允许用户更新该对象,但不允许用户删除该对象 
//Allow user to update this object, but not allow user to delete this object
return [
  result: [
    'update': true,
    'delete': false
  ]
] 
1
2
3
4
5
6
7
Last Updated: 2024/12/4 13:00:56