基于特性的访问控制AuraDB 关键业务版AuraDB 虚拟专用云Cypher 25企业版2026.03 引入
基于属性的访问控制 (ABAC) 根据用户身份验证令牌中包含的属性(或声明)的评估结果来授予角色。
设置
要设置基于属性的访问控制,请遵循以下步骤:
-
在 neo4j.conf 文件中,将
dbms.security.abac.authorization_providers设置为您希望用于 ABAC 的 OIDC 提供商。 -
使用
CREATE AUTH RULE命令定义授权规则,以便根据用户属性授予角色。详细信息请参阅 创建授权规则。 -
使用
GRANT ROLE命令指定在满足授权规则时要分配的角色。详细信息请参阅 将角色分配给授权规则。
创建授权规则
要创建授权规则,请使用 CREATE AUTH RULE 命令。
|
|
CREATE AUTH RULE 语法CREATE [OR REPLACE] AUTH RULE ruleName (1)
[IF NOT EXISTS] (2)
SET CONDITION conditionExpression (3)
[ SET ENABLED {true | false} ] (4)
说明:
示例 1:创建带有简单条件的授权规则
以下示例创建了一条授权规则,将关联的角色授予 department 属性等于 sales 的用户:
CREATE AUTH RULE salesRule
SET CONDITION abac.oidc.user_attribute('department') = 'sales';
示例 2:创建带有多个条件的授权规则
以下示例创建了一条授权规则,将关联的角色授予 department 属性等于 engineering 且 location 属性等于 UK 的用户:
CREATE AUTH RULE engineeringUKRule
SET CONDITION abac.oidc.user_attribute('department') = 'engineering'
AND abac.oidc.user_attribute('location') = 'UK';
将角色分配给授权规则
要指定在满足授权规则时向用户授予哪些角色,请使用 GRANT ROLE 命令。
|
|
GRANT ROLE 语法GRANT ROLE[S] role[, ...] TO AUTH RULE[S] ruleName[, ...]
有关 GRANT ROLE 命令的信息,请参阅 将角色分配给用户。
以下示例将角色分配给 创建授权规则 中示例里的授权规则:
GRANT ROLE salesTeam TO AUTH RULE salesRule;
GRANT ROLE engineeringTeamUK TO AUTH RULE engineeringUKRule;
GRANT ROLE countryAccessRole TO AUTH RULE ruleset_countries;
GRANT ROLE reader TO AUTH RULE temporary_reader;
|
任何具有关联拒绝权限的角色都不能分配给授权规则。 此外,一旦某个角色已被分配给授权规则,随后便不能再向该角色赋予被拒绝的权限。这确保了如果某个规则意外未被满足(例如,由于用户的身份验证令牌中缺少某个声明),则永远不会发生权限提升,只会发生权限缩减。 |
|
ABAC 规则不会限制 RBAC 角色。用户既会获得其 RBAC 角色,也会获得已满足的 ABAC 规则所授予的角色。如果用户通过 ABAC 和 RBAC 同时获得了某个角色,则无论 ABAC 规则当前是否满足,用户都将拥有该角色。例如,如果用户因为出现在其 JWT |
列出授权规则
您可以使用 Cypher 命令 SHOW AUTH RULES 列出所有授权规则。
|
|
SHOW AUTH RULES 返回一个表格,每条授权规则占一行,包含以下列:
| 列 | 描述 | 类型 |
|---|---|---|
名称 (name) |
如 |
|
condition |
在确定是否向用户授予角色时进行评估的 Cypher 表达式。 |
|
enabled |
授权规则是否启用。当规则启用时,此列值为 |
|
角色 |
通过一个或多个 |
|
要将授权规则作为命令查看,请使用 SHOW AUTH RULES AS COMMANDS,默认返回单列。您可以选择附加 YIELD * 以额外查看授予该授权规则的角色。
| 列 | 描述 | 类型 |
|---|---|---|
command(命令) |
用于创建授权规则的 |
|
角色 |
通过一个或多个 |
|
示例 1:列出授权规则
以下示例列出了所有授权规则及其条件、启用状态和已分配的角色:
SHOW AUTH RULES;
| 名称 (name) | condition | enabled | 角色 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行:3 |
|||
示例 2:带过滤和排序功能的列出授权规则
要过滤和排序返回的结果,您可以使用 YIELD、ORDER BY 和 WHERE:
SHOW AUTH RULES YIELD name, roles
ORDER BY name
WHERE name ENDS WITH 'e';
结果为一个授权规则表,其名称以 'e' 结尾,以及它们已分配的角色,并按 name 排序。
| 名称 (name) | 角色 |
|---|---|
|
|
|
|
行:2 |
|
也可以使用 SKIP 和 LIMIT 对结果进行分页。
示例 3:以命令形式列出授权规则
以下示例以命令形式列出授权规则:
SHOW AUTH RULES AS COMMANDS;
| command(命令) |
|---|
|
|
|
行:3 |
重命名授权规则
要重命名现有的授权规则,请使用 RENAME AUTH RULE 命令。
|
|
RENAME AUTH RULE 语法RENAME AUTH RULE ruleName [IF EXISTS] TO newRuleName
如果指定 IF EXISTS,则如果规则不存在,不会抛出错误,且该命令无效。
例如,使用以下命令将授权规则 ruleset_countries 重命名为 disabled_ruleset_countries:
RENAME AUTH RULE ruleset_countries TO disabled_ruleset_countries;
修改授权规则
要修改现有的授权规则,请使用 ALTER AUTH RULE 命令。
|
|
ALTER AUTH RULE 语法ALTER AUTH RULE ruleName [IF EXISTS]
[SET CONDITION conditionExpression]
[SET ENABLED {true | false}]
如果指定 IF EXISTS,则如果规则不存在,不会抛出错误,且该命令无效。必须至少指定 SET CONDITION 和 SET ENABLED 中的一项。
删除授权规则
要删除现有的授权规则,请使用 DROP AUTH RULE 命令。
|
|
DROP AUTH RULE 语法DROP AUTH RULE ruleName [IF EXISTS]
如果指定 IF EXISTS,则如果规则不存在,不会抛出错误,且该命令无效。
例如,使用以下命令删除授权规则 temporary_reader:
DROP AUTH RULE temporary_reader;
注意事项与局限性
ABAC 具有以下注意事项与局限性:
-
在评估
abac.oidc.user_attribute('<claim_key>')时,如果身份验证令牌中不存在该声明,则评估结果为NULL。 -
新创建的授权规则会应用于现有用户会话,但只能访问在会话开始时有规则引用它们的用户声明。只有在会话开始时已存在于授权规则中的用户声明才会被保留。如果新规则使用新的声明,用户必须重新进行身份验证,以便应用新规则。
-
基于属性的访问控制仅支持 OIDC 身份验证提供商。
-
要排查 ABAC 评估问题,请为安全日志和调试日志启用调试记录,并在 neo4j.conf 文件中设置
dbms.security.logs.oidc.jwt_claims_at_debug_level_enabled=true以开启调试级别的 JWT 声明日志记录。