跳转至

内置角色权限

所谓角色,就是一组相关权限的集合。用户可以把角色分配给创建的用户,从而实现访问控制。

内置角色

NebulaGraph 内置了多种角色,说明如下:

  • God

    • 初始最高权限角色,拥有所有操作的权限。类似于 Linux 中的root和 Windows 中的administrator
    • Meta 服务初始化时,会自动创建 God 角色用户root,密码为nebula

      注意

      请及时修改root用户的密码,保证数据安全。

    • nebula-graphd.conf文件中(默认目录为/usr/local/nebula/etc/),当--enable_authorizetrue时:

      • 一个集群只能有一个 God 角色用户,该用户可以管理集群内所有图空间。
      • 不支持手动授权 God 角色,只能使用默认 God 角色用户root
  • Admin

    • 对权限内的图空间拥有 Schema 和 data 的读写权限。
    • 可以将权限内的图空间授权给其他用户。

      注意

      只能授权低于 ADMIN 级别的角色给其他用户。

  • DBA

    • 对权限内的图空间拥有 Schema 和 data 的读写权限。
    • 无法将权限内的图空间授权给其他用户。
  • User

    • 对权限内的图空间拥有 Schema 的只读权限。
    • 对权限内的图空间拥有 data 的读写权限。
  • Guest

    • 对权限内的图空间拥有 Schema 和 data 的只读权限。
  • Basic

    • 对权限内的图空间拥有 Schema 的只读权限。
    • (需额外授权)对权限内的图空间拥有 Tag 和 Edge Type 的读写权限。

Enterpriseonly

Basic 角色仅在企业版中提供。

Note

  • 不支持自行创建角色,只能使用默认的内置角色。
  • 一个用户在一个图空间内只能拥有一个角色权限。授权用户请参见用户管理

角色权限

各角色的执行权限如下。

权限 God Admin DBA User Guest Basic(企业版) 相关语句
Read space Y Y Y Y Y Y USEDESCRIBE SPACE
Read schema Y Y Y Y Y Y DESCRIBE TAGDESCRIBE EDGEDESCRIBE TAG INDEXDESCRIBE EDGE INDEX
Write schema Y Y Y CREATE TAGALTER TAGCREATE EDGEALTER EDGEDROP TAGDELETE TAGDROP EDGECREATE TAG INDEXCREATE EDGE INDEXDROP TAG INDEXDROP EDGE INDEX
Write user Y CREATE USERDROP USERALTER USER
Write role Y Y GRANTREVOKE
Read data Y Y Y Y Y C GOSETPIPEMATCHASSIGNMENTLOOKUPYIELDORDER BYFETCH VERTICESFindFETCH EDGESFIND PATHLIMITGROUP BYRETURN
Write data Y Y Y Y C INSERT VERTEXUPDATE VERTEXINSERT EDGEUPDATE EDGEDELETE VERTEXDELETE EDGESDELETE TAG
Show operations Y Y Y Y Y Y SHOWCHANGE PASSWORD
Job Y Y Y Y SUBMIT JOB COMPACTSUBMIT JOB FLUSHSUBMIT JOB STATSSTOP JOBRECOVER JOBBUILD TAG INDEXBUILD EDGE INDEXINGESTDOWNLOAD
Write space Y CREATE SPACEDROP SPACECREATE SNAPSHOTDROP SNAPSHOTBALANCECONFIG

Enterpriseonly

当前仅企业版支持基于 Basic 角色的细粒度(Tag/Edge type 级别)权限管理。

Caution

Show operations 为特殊操作,只会在自身权限内执行。例如SHOW SPACES,每个角色都可以执行,但是只会返回自身权限内的图空间。 只有 God 角色可以执行SHOW USERSSHOW SNAPSHOTS语句。

Basic 角色(企业版)

语法

Caution

进入图空间后才可执行以下命令。

  • 授予 Basic 用户 Tag/Edge 权限
GRANT { OPTION[,OPTION] } [ TAG {  * | <tag>[,...] } | EDGE {  * | <edge_type>[, ...] }] TO <user_name>;
OPTION = { READ | WRITE }
  • 取消 Basic 用户 Tag/Edge 权限
REVOKE { OPTION[,OPTION] } [ TAG {  * | <tag>[,...] } | EDGE {  * | <edge_type>[, ...] }] TO <user_name>;
OPTION = { READ | WRITE }
  • 查询用户权限
SHOW GRANTS [<user_name>]

注意事项

  • 默认 Basic 角色无任何 Tag/Edge 读写权限。
  • 只有 GOD 和 ADMIN 角色用户能执行授权(GRANT)和撤销权限(REVOKE)操作。
  • 只允许用户在指定图空间对 Basic 角色进行授权(GRANT)和撤销权限(REVOKE)操作,不允许授权给其他角色用户。
  • Basic 角色不允许插入无 Tag 的点。
  • 执行 UPDATE 或 UPSERT 操作必须同时拥有读权限和写权限。

示例

# 创建 test 用户
nebula> CREATE USER test WITH PASSWORD 'nebula';

# 为 test 用户创建 Basic 角色权限
nebula> GRANT ROLE BASIC ON basketballplayer TO test;

# 选择图空间 basketballplayer
nebula> use basketballplayer;

# 授予 test 用户 Tag `player` 和 Edge Type `follow` 和 `serve` 的读写权限 
# 授予用户指定 Tag/Edge 读写权限必须在指定图空间后
nebula> GRANT READ, WRITE TAG player EDGE follow, serve TO test;

# 查询 test 用户权限
nebula> > SHOW GRANTS test;
+--------+------------+---------------------+------------+---------------------+
| user   | READ(TAG)  | READ(EDGE)          | WRITE(TAG) | WRITE(EDGE)         |
+--------+------------+---------------------+------------+---------------------+
| "test" | ["player"] | ["follow", "serve"] | ["player"] | ["follow", "serve"] |
+--------+------------+---------------------+------------+---------------------+

# 取消 test 用户 所有 Edge Type 的读、写权限
nebula> REVOKE READ,WRITE EDGE * FROM test;

# 查询 test 用户权限
nebula> SHOW GRANTS test;
+--------+------------+------------+------------+-------------+
| user   | READ(TAG)  | READ(EDGE) | WRITE(TAG) | WRITE(EDGE) |
+--------+------------+------------+------------+-------------+
| "test" | ["player"] | []         | ["player"] | []          |
+--------+------------+------------+------------+-------------+

# Basic 角色用户读取无权限的数据时,将会出现以下报错
nebula>  MATCH (v:player)-[:likex]-() RETURN v;
[ERROR (-1008)]: PermissionError: Edge `likex' does not exist or is not readable.

Caution

对于 Basic 角色用户,显式指定无读权限的 Tag/Edge Type 将报错,未显式指定无读权限的 Tag/Edge Type 不会报错。在遍历过程中,所有查询无法读取无权限的 Tag/Edge Type 及其上的属性。Edge Type 的读权限可控制边的扩展行为,在遍历过程中,如果 Edge Type 无权限,将不会进行拓展;Tag 的读权限不控制点的拓展行为,拓展过程中即使点上 Tag 无权限,仍可进行拓展。


最后更新: September 4, 2023