管理角色

角色可以通过针对 system 数据库执行的一组 Cypher 管理命令来创建和管理。

当通过 bolt 连接到 DBMS 时,管理命令会自动路由到 system 数据库。

角色管理命令语法

有关语法描述的更多详细信息,请参阅 数据库管理命令语法

表 1. SHOW ROLES 命令语法

命令

SHOW ROLES

语法

SHOW [ALL|POPULATED] ROLE[S]
  [YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]
  [WHERE expression]
  [RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

描述

列出角色。

使用 RETURN 子句时,YIELD 子句是强制性的,不能省略。

有关详细信息,请参阅 列出角色

所需权限

GRANT SHOW ROLE
表 2. SHOW ROLES WITH USERS 命令语法

命令

SHOW ROLES WITH USERS

语法

SHOW [ALL|POPULATED] ROLE[S] WITH USER[S]
  [YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]
  [WHERE expression]
  [RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

描述

列出角色及其分配的用户。

使用 RETURN 子句时,YIELD 子句是强制性的,不能省略。

有关详细信息,请参阅 列出角色

所需权限

GRANT SHOW ROLE

有关详细信息,请参阅 DBMS 角色管理权限

GRANT SHOW USER

有关详细信息,请参阅 DBMS 用户管理权限

表 3. SHOW ROLES WITH AUTH RULES 命令语法

命令

SHOW ROLES WITH AUTH RULES

语法

SHOW [ALL|POPULATED] ROLE[S] WITH AUTH RULE[S]
  [YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]
  [WHERE expression]
  [RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

描述

列出角色及其关联的身份验证规则。

使用 RETURN 子句时,YIELD 子句是强制性的,不能省略。

有关详细信息,请参阅 列出角色

所需权限

GRANT SHOW ROLE

有关详细信息,请参阅 DBMS 角色管理权限

GRANT SHOW AUTH RULE

有关详细信息,请参阅 DBMS 身份验证规则管理权限

表 4. SHOW ROLE PRIVILEGES 命令语法

命令

SHOW ROLE PRIVILEGES

语法

SHOW ROLE[S] name[, ...] PRIVILEGE[S] [AS [REVOKE] COMMAND[S]]
  [YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]
  [WHERE expression]
  [RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

描述

列出授予指定角色的权限。

使用 RETURN 子句时,YIELD 子句是强制性的,不能省略。

SHOW ROLE name PRIVILEGES 命令在 列出权限 中有详细说明。

所需权限

GRANT SHOW PRIVILEGE
表 5. CREATE [IMMUTABLE] ROLE 命令语法

命令

CREATE [IMMUTABLE] ROLE

语法

CREATE ROLE name [IF NOT EXISTS] [AS COPY OF otherName]

描述

创建一个新角色。

有关详细信息,请参阅 创建角色

所需权限

GRANT CREATE ROLE

有关详细信息,请参阅 DBMS 角色管理权限

表 6. CREATE OR REPLACE [IMMUTABLE] ROLE 命令语法

命令

CREATE OR REPLACE [IMMUTABLE] ROLE

语法

CREATE OR REPLACE [IMMUTABLE] ROLE name [AS COPY OF otherName]

描述

创建一个新角色;如果同名角色已存在,则将其替换。

有关详细信息,请参阅 创建角色

所需权限

GRANT CREATE ROLE
GRANT DROP ROLE

有关详细信息,请参阅 DBMS 角色管理权限

表 7. RENAME ROLE 命令语法

命令

RENAME ROLE

语法

RENAME ROLE name [IF EXISTS] TO otherName

描述

更改角色名称。

有关详细信息,请参阅 重命名角色

所需权限

GRANT RENAME ROLE

有关详细信息,请参阅 DBMS 角色管理权限

表 8. DROP ROLE 命令语法

命令

DROP ROLE

语法

DROP ROLE name [IF EXISTS]

描述

删除一个角色。

有关详细信息,请参阅 删除角色

所需权限

GRANT DROP ROLE

有关详细信息,请参阅 DBMS 角色管理权限

表 9. GRANT ROLE TO 命令语法

命令

GRANT ROLE TO

语法

GRANT ROLE[S] name[, ...]
TO {AUTH RULE[S] authrule[, ...] | [USER[S]] user[, ...]}

描述

直接将角色分配给用户,或通过基于属性的访问控制(ABAC)身份验证规则间接分配。

有关将角色分配给用户的更多信息,请参阅 将角色分配给用户

有关将角色分配给身份验证规则的更多信息,请参阅 将角色分配给身份验证规则

所需权限

GRANT ASSIGN ROLE

有关详细信息,请参阅 DBMS 角色管理权限

表 10. REVOKE ROLE 命令语法

命令

REVOKE ROLE

语法

REVOKE ROLE[S] name[, ...]
FROM {AUTH RULE[S] authrule[, ...] | [USER[S]] user[, ...]}

描述

从用户或基于属性的访问控制身份验证规则中移除角色。

有关从用户撤销角色的更多信息,请参阅 从用户撤销角色

有关从身份验证规则撤销角色的更多信息,请参阅 从身份验证规则撤销角色

所需权限

GRANT REMOVE ROLE

有关详细信息,请参阅 DBMS 角色管理权限

列出角色

您可以使用 Cypher 命令 SHOW ROLES 查看所有可用角色,默认情况下它会返回单列结果。您可以选择使用 SHOW ROLES YIELD * 来查看角色是否为不可变角色(Immutable)。有关更多信息,请参阅 不可变角色

表 11. SHOW ROLES 输出
描述 类型

role(角色)

角色名称

STRING

immutable(不可变)

如果角色是不可变的,则为 true,否则为 false

布尔值 (BOOLEAN)

列出所有角色

要列出所有角色,请使用 SHOW ROLES 命令

SHOW ROLES

这与 SHOW ALL ROLES 命令相同。

表 12. 结果
role(角色)

"PUBLIC"

"admin"

"architect"

"editor"

"publisher"

"reader"

行数: 6

首次启动 Neo4j DBMS 时,会有一些内置角色:

  • PUBLIC - 所有用户都拥有的角色。默认情况下,它授予对主数据库的访问权限以及执行过程和函数的权限。

  • reader - 可以在除 system 之外的所有数据库中执行遍历和读取操作。

  • editor - 可以在除 system 之外的所有数据库中执行遍历、读取和写入操作,但不能创建新的标签或关系类型。

  • publisher - 与 editor 功能相同,但还可以创建新的标签和关系类型。

  • architect - 与 publisher 功能相同,此外还可以创建和管理索引与约束。

  • admin - 拥有上述所有角色的功能,此外还可以管理数据库、别名、用户、角色和权限。

有关内置角色及其权限的更多信息,请参阅 内置角色和权限

此命令有多个版本,默认是 SHOW ALL ROLES。若仅显示已分配给用户或身份验证规则的角色,可使用命令 SHOW POPULATED ROLES。它返回与 SHOW ROLES 相同的输出列。

列出分配给角色的用户

要查看哪些用户被分配了哪些角色,可以在命令中添加 WITH USERS

SHOW POPULATED ROLES WITH USERS

该命令为每个角色/用户组合生成一行,并在 SHOW ROLES 返回的列之外,额外产生一个 member 列,其中包含分配给该角色的用户名;如果角色未分配给任何用户,则为 null。如果一个角色分配给多个用户,它将为每个用户显示一次。

表 13. 结果
role(角色) member

"PUBLIC"

"neo4j"

"PUBLIC"

"bob"

"PUBLIC"

"user1"

"PUBLIC"

"user2"

"PUBLIC"

"user3"

"admin"

"neo4j"

行数: 6

列出分配给角色的身份验证规则

要查看哪些身份验证规则被分配了哪些角色,请在命令中添加 WITH AUTH RULES

SHOW POPULATED ROLES WITH AUTH RULES

该命令为每个角色/身份验证规则组合生成一行,并在 SHOW ROLES 返回的列之外,额外产生一个 authRule 列,其中包含分配给该角色的身份验证规则名称;如果角色未分配给任何身份验证规则,则为 null。如果一个角色分配给多个身份验证规则,它将为每个规则显示一次。

表 14. 结果
role(角色) authRule

"PUBLIC"

null

"admin"

"adminRule"

行数: 6

过滤和排序角色结果

您可以使用 YIELDORDER BYWHERE 来过滤和排序结果

SHOW ROLES YIELD role
ORDER BY role
WHERE role ENDS WITH 'r'

在此示例中

  • 结果被过滤,仅返回以 'r' 结尾的角色。

  • 结果使用 ORDER BYrole 列排序。

也可以使用 SKIPLIMIT 对结果进行分页。

表 15. 结果
role(角色)

"editor"

"publisher"

"reader"

行:3

创建角色

根据您的需求,有多种创建角色的方法。

以下命名规则适用于在 Neo4j 中创建的所有角色

  • 第一个字符必须是 ASCII 字母字符。

  • 后续字符可以是 ASCII 字母、数字和下划线。

  • 角色名称区分大小写。

创建新角色

您可以使用 CREATE [IMMUTABLE] ROLE 创建角色

CREATE [IMMUTABLE] ROLE name [IF NOT EXISTS] [AS COPY OF otherName]

CREATE ROLE 命令是可选幂等的,默认行为是如果角色已存在则抛出异常。在 CREATE ROLE 命令中添加 IF NOT EXISTS 可确保不抛出异常,且如果角色已存在则不执行任何操作。

CREATE ROLE myrole IF NOT EXISTS

创建与现有角色具有相同权限的新角色

您可以使用 CREATE [IMMUTABLE] ROLE name AS COPY OF otherName 复制一个角色,同时保留其权限

CREATE ROLE mysecondrole AS COPY OF myrole

创建的角色会出现在 SHOW ROLES 提供的列表中

SHOW ROLES
表 16. 结果
role(角色)

"PUBLIC"

"admin"

"architect"

"editor"

"myrole"

"mysecondrole"

"publisher"

"reader"

行:8

创建新角色或替换现有角色

您可以使用 CREATE OR REPLACE [IMMUTABLE] ROLE 创建或替换角色

CREATE OR REPLACE [IMMUTABLE] ROLE name [AS COPY OF otherName]

CREATE OR REPLACE ROLE 命令会导致任何现有角色被删除,并创建一个新角色。
例如:

CREATE OR REPLACE ROLE myrole

命令 CREATE OR REPLACE ROLE myrole 将删除现有的 myrole 并创建一个同名的新角色。这等同于执行 DROP ROLE myrole IF EXISTS,然后执行 CREATE ROLE myrole

CREATE OR REPLACE ROLE 命令不允许使用 IF NOT EXISTS

不可变角色

不可变角色(Immutable roles)是无法通过常规方式修改的角色。这意味着在正常操作条件下,它们不能被创建、重命名、删除,也不能被授予或撤销权限。有关何时以及如何使用 IMMUTABLE 关键字的详细信息,请参阅 不可变角色和权限

它们在需要永久内置系统角色的情况下非常有用,即使对于拥有 角色管理 权限 的用户,这些角色也是不可修改的;但它们仍然可以像普通角色一样分配给用户或从用户中撤销。

重命名角色

您可以使用 RENAME ROLE 命令重命名角色

RENAME ROLE mysecondrole TO mythirdrole

重命名角色后,新名称将出现在 SHOW ROLES 提供的列表中

SHOW ROLES
表 17. 结果
role(角色)

"PUBLIC"

"admin"

"architect"

"editor"

"myrole"

"mythirdrole"

"publisher"

"reader"

行:8

RENAME ROLE 命令仅在使用本地身份验证和授权时可用。

将角色分配给用户

本节介绍了如何直接将角色授予用户。有关如何根据基于属性的规则将角色分配给用户的信息,请参阅 基于属性的访问控制

将角色分配给用户

可以通过使用 GRANT ROLE 分配角色来赋予用户访问权限

GRANT ROLE myrole TO bob

每个用户分配的角色可以在 SHOW USERS 提供的列表中查看

SHOW USERS
表 18. 结果
user(用户) 角色 passwordChangeRequired suspended home

"bob"

["myrole","PUBLIC"]

false

false

<null>

"neo4j"

["admin","PUBLIC"]

true

false

<null>

"user1"

["PUBLIC"]

true

false

<null>

"user2"

["PUBLIC"]

true

false

<null>

"user3"

["PUBLIC"]

true

false

<null>

行:5

将多个角色分配给多个用户

您可以在一个命令中将多个角色分配给多个用户

GRANT ROLES role1, role2 TO user1, user2, user3
SHOW USERS
表 19. 结果
user(用户) 角色 passwordChangeRequired suspended home

"bob"

["myrole","PUBLIC"]

false

false

<null>

"neo4j"

["admin","PUBLIC"]

true

false

<null>

"user1"

["role1","role2","PUBLIC"]

true

false

<null>

"user2"

["role1","role2","PUBLIC"]

true

false

<null>

"user3"

["role1","role2","PUBLIC"]

true

false

<null>

行:5

诸如尝试将已授予的角色再次分配给用户等常见错误,会导致通知。其中一些通知在未来的 Neo4j 主要版本中可能会被错误消息取代。有关通知的详细信息,请参阅 错误与通知状态码 → 通知代码列表

从用户撤销角色

本节介绍了如何直接从用户撤销角色。有关如何根据基于属性的规则从用户撤销角色分配的信息,请参阅 基于属性的访问控制

从用户撤销角色

可以通过使用 REVOKE ROLE 撤销其角色来让用户失去访问权限

REVOKE ROLE myrole FROM bob

从用户撤销的角色将不再出现在 SHOW USERS 提供的列表中

SHOW USERS
表 20. 结果
user(用户) 角色 passwordChangeRequired suspended home

"bob"

["PUBLIC"]

false

false

<null>

"neo4j"

["admin","PUBLIC"]

true

false

<null>

"user1"

["role1","role2","PUBLIC"]

true

false

<null>

"user2"

["role1","role2","PUBLIC"]

true

false

<null>

"user3"

["role1","role2","PUBLIC"]

true

false

<null>

行:5

从多个用户撤销多个角色

您可以在一个命令中从多个用户撤销多个角色

REVOKE ROLES role1, role2 FROM user1, user2, user3

诸如拼写错误或尝试撤销用户未拥有的角色等常见错误,会导致通知。在 Cypher 25 中,针对不存在用户、角色或数据库的无效 REVOKE 命令,其通知已替换为错误。有关通知的详细信息,请参阅 错误与通知状态码 → 通知代码列表

删除角色

您可以使用 DROP ROLE 命令删除不再需要的角色

DROP ROLE mythirdrole

删除角色会将其从 SHOW ROLES 提供的列表中移除

SHOW ROLES
表 21. 结果
role(角色)

"PUBLIC"

"admin"

"architect"

"editor"

"myrole"

"publisher"

"reader"

行:8

此命令是可选幂等的,默认行为是如果角色不存在则抛出异常。在命令中添加 IF EXISTS 将确保不抛出异常,如果角色不存在则不执行任何操作。

DROP ROLE mythirdrole IF EXISTS