DBMS EXECUTE 权限

关于存储过程和用户自定义函数执行的 DBMS 权限,可以像其他权限一样进行授予、拒绝或撤销。

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

表 1. 执行权限命令语法
命令 描述
GRANT [IMMUTABLE] EXECUTE PROCEDURE[S] name-globbing[, ...]
  ON DBMS
  TO role[, ...]

允许指定的角色执行给定的存储过程。

GRANT [IMMUTABLE] EXECUTE BOOSTED PROCEDURE[S] name-globbing[, ...]
  ON DBMS
  TO role[, ...]

允许指定的角色在执行给定的存储过程时使用提升的权限。

GRANT [IMMUTABLE] EXECUTE ADMIN[ISTRATOR] PROCEDURES
  ON DBMS
  TO role[, ...]

允许指定的角色执行带有 @Admin 注解的存储过程。这些存储过程将以提升的权限执行。

GRANT [IMMUTABLE] EXECUTE [USER [DEFINED]] FUNCTION[S] name-globbing[, ...]
  ON DBMS
  TO role[, ...]

允许指定的角色执行给定的用户自定义函数。

GRANT [IMMUTABLE] EXECUTE BOOSTED [USER [DEFINED]] FUNCTION[S] name-globbing[, ...]
  ON DBMS
  TO role[, ...]

允许指定的角色在执行给定的用户自定义函数时使用提升的权限。

授予执行存储过程的权限

您可以使用 EXECUTE PROCEDURE 权限授予执行存储过程的权限。
拥有此权限的角色可以执行符合 名称通配 (name-globbing) 规则的存储过程。

授予执行部分存储过程的权限

以下查询允许执行以 db.schema 开头的存储过程

GRANT EXECUTE PROCEDURE db.schema.* ON DBMS TO procedureExecutor;

拥有 procedureExecutor 角色的用户可以运行 db.schema 命名空间中的任何存储过程。存储过程将使用用户自身的权限进行执行。

要以命令形式列出 procedureExecutor 角色的所有权限,请使用以下查询

SHOW ROLE procedureExecutor PRIVILEGES AS COMMANDS;
表 2. 结果
command(命令)

"GRANT EXECUTE PROCEDURE db.schema.* ON DBMS TO `procedureExecutor`"

行:1

授予除少数存储过程外执行所有存储过程的权限

您可以使用 EXECUTE PROCEDURES * 授予执行除少数几个之外的所有存储过程的权限,并拒绝不需要的存储过程。例如,以下查询允许执行所有存储过程,除了那些以 dbms.cluster 开头的存储过程

GRANT EXECUTE PROCEDURE * ON DBMS TO deniedProcedureExecutor;
DENY EXECUTE PROCEDURE dbms.cluster* ON DBMS TO deniedProcedureExecutor;

拥有 deniedProcedureExecutor 角色的用户可以运行除以 dbms.cluster 开头之外的任何存储过程。存储过程将使用用户自身的权限进行执行。

要以命令形式列出 deniedProcedureExecutor 角色的所有权限,请使用以下查询

SHOW ROLE deniedProcedureExecutor PRIVILEGES AS COMMANDS;
表 3. 结果
command(命令)

"DENY EXECUTE PROCEDURE dbms.cluster* ON DBMS TO `deniedProcedureExecutor`"

"GRANT EXECUTE PROCEDURE * ON DBMS TO `deniedProcedureExecutor`"

行:2

dbms.cluster.checkConnectivitydbms.cluster.cordonServerdbms.cluster.protocolsdbms.cluster.readReplicaToggledbms.cluster.routing.getRoutingTabledbms.cluster.secondaryReplicationDisabledbms.cluster.setAutomaticallyEnableFreeServersdbms.cluster.uncordonServer 存储过程被阻止,以及任何其他以 dbms.cluster 开头的存储过程。

授予以提升权限执行存储过程的权限

您可以使用 EXECUTE BOOSTED PROCEDURE 权限授予以提升权限执行存储过程的权限。
拥有此权限的用户在执行符合 名称通配 规则的存储过程时,将不受其其他权限的限制。EXECUTE BOOSTED PROCEDURE 权限仅影响权限提升,而不影响存储过程本身的执行。因此,还需要为这些存储过程授予 EXECUTE PROCEDURE 权限。要以提升的权限执行存储过程,必须同时拥有 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 权限。

授予以提升权限执行部分存储过程的权限

您可以使用 EXECUTE BOOSTED PROCEDURE * 授予以提升权限执行部分存储过程的权限。

例如,以下查询允许以提升的权限执行 db.labelsdb.relationshipTypes 存储过程,并使用用户自身的权限执行所有其他存储过程

GRANT EXECUTE PROCEDURE * ON DBMS TO boostedProcedureExecutor;
GRANT EXECUTE BOOSTED PROCEDURE db.labels, db.relationshipTypes ON DBMS TO boostedProcedureExecutor

拥有 boostedProcedureExecutor 角色的用户因此可以以完全权限运行 db.labelsdb.relationshipTypes 存储过程,查看图中的所有内容,而不仅仅是用户拥有 TRAVERSE 权限的标签和类型。如果没有 EXECUTE PROCEDURE,则无法执行任何存储过程。

要以命令形式列出 boostedProcedureExecutor 角色的所有权限,请使用以下查询

SHOW ROLE boostedProcedureExecutor PRIVILEGES AS COMMANDS;
表 4. 结果
command(命令)

"GRANT EXECUTE PROCEDURE * ON DBMS TO `boostedProcedureExecutor`"

"GRANT EXECUTE BOOSTED PROCEDURE db.labels ON DBMS TO `boostedProcedureExecutor`"

"GRANT EXECUTE BOOSTED PROCEDURE db.relationshipTypes ON DBMS TO `boostedProcedureExecutor`"

行:3

授予执行权限与拒绝权限提升的组合

与授予一样,单独拒绝 EXECUTE BOOSTED PROCEDURE 仅影响权限提升,而不影响存储过程的执行。

例如:

GRANT EXECUTE PROCEDURE * ON DBMS TO deniedBoostedProcedureExecutor1;
DENY EXECUTE BOOSTED PROCEDURE db.labels ON DBMS TO deniedBoostedProcedureExecutor1;

因此,deniedBoostedProcedureExecutor1 角色拥有的权限允许使用用户自身的权限执行所有存储过程。它们还阻止了 db.labels 存储过程的权限提升。不过,拒绝的 EXECUTE BOOSTED PROCEDURE 并不会阻止 db.labels 的执行。

要以命令形式列出 deniedBoostedProcedureExecutor1 角色的所有权限,请使用以下查询

SHOW ROLE deniedBoostedProcedureExecutor1 PRIVILEGES AS COMMANDS;
表 5. 结果
command(命令)

"DENY EXECUTE BOOSTED PROCEDURE db.labels ON DBMS TO `deniedBoostedProcedureExecutor1`"

"GRANT EXECUTE PROCEDURE * ON DBMS TO `deniedBoostedProcedureExecutor1`"

行:2

授予权限提升与拒绝执行的组合

您还可以授予以提升权限执行存储过程的权限,并拒绝执行特定的存储过程。

例如:

GRANT EXECUTE BOOSTED PROCEDURE * ON DBMS TO deniedBoostedProcedureExecutor2;
DENY EXECUTE PROCEDURE db.labels ON DBMS TO deniedBoostedProcedureExecutor2;

因此,deniedBoostedProcedureExecutor2 角色拥有允许提升所有存储过程权限的权限,但由于缺少或被拒绝了 EXECUTE PROCEDURE 权限,因此无法执行任何存储过程。

要以命令形式列出 deniedBoostedProcedureExecutor2 角色的所有权限,请使用以下查询

SHOW ROLE deniedBoostedProcedureExecutor2 PRIVILEGES AS COMMANDS;
表 6. 结果
command(命令)

"DENY EXECUTE PROCEDURE db.labels ON DBMS TO `deniedBoostedProcedureExecutor2`"

"GRANT EXECUTE BOOSTED PROCEDURE * ON DBMS TO `deniedBoostedProcedureExecutor2`"

行:2

授予与拒绝权限提升的组合

您还可以授予以提升权限执行存储过程的权限,并拒绝针对特定存储过程的提升。

例如,以下查询所拥有的权限允许提升除 db.labels 之外的所有存储过程的权限。但是,由于缺少 EXECUTE PROCEDURE 权限,无法执行任何存储过程。

GRANT EXECUTE BOOSTED PROCEDURE * ON DBMS TO deniedBoostedProcedureExecutor3;
DENY EXECUTE BOOSTED PROCEDURE db.labels ON DBMS TO deniedBoostedProcedureExecutor3;

因此,deniedBoostedProcedureExecutor3 角色拥有允许提升除 db.labels 之外的所有存储过程的权限。但是,由于缺少 EXECUTE PROCEDURE 权限,无法执行任何存储过程。

要以命令形式列出 deniedBoostedProcedureExecutor3 角色的所有权限,请使用以下查询

SHOW ROLE deniedBoostedProcedureExecutor3 PRIVILEGES AS COMMANDS;
表 7. 结果
command(命令)

"DENY EXECUTE BOOSTED PROCEDURE db.labels ON DBMS TO `deniedBoostedProcedureExecutor3`"

"GRANT EXECUTE BOOSTED PROCEDURE * ON DBMS TO `deniedBoostedProcedureExecutor3`"

行:2

通过权限控制存储过程输出

您可以使用 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 权限,根据授予或拒绝角色的权限来控制存储过程的输出。例如,假设有一个名为 myProc 的存储过程。

此存储过程对于仅拥有 EXECUTE PROCEDURE 权限的用户给出结果 AB;对于同时拥有 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 权限的用户,则给出 ABC

现在,将 授予执行与拒绝权限提升的组合(示例 1)、授予权限提升与拒绝执行的组合(示例 2)以及 授予与拒绝权限提升的组合(示例 3)中的权限适配到此存储过程,并展示其返回结果。

使用示例 1 中的权限(授予 EXECUTE PROCEDURE * 并拒绝 EXECUTE BOOSTED PROCEDURE myProc),myProc 存储过程返回结果 AB

使用示例 2 中的权限(授予 EXECUTE BOOSTED PROCEDURE * 并拒绝 EXECUTE PROCEDURE myProc),不允许执行 myProc 存储过程。

使用示例 3 中的权限(授予 EXECUTE BOOSTED PROCEDURE * 并拒绝 EXECUTE BOOSTED PROCEDURE myProc),不允许执行 myProc 存储过程。

作为对比,当授予:

  • EXECUTE PROCEDURE myProc 时:myProc 存储过程返回结果 AB

  • EXECUTE BOOSTED PROCEDURE myProc 时:不允许执行 myProc 存储过程。

  • EXECUTE PROCEDURE myProcEXECUTE BOOSTED PROCEDURE myProc 时:myProc 存储过程返回结果 ABC

授予执行管理存储过程的权限

管理存储过程(带有 @Admin 注解)比较特殊,因为它们需要提升的权限才能执行。这意味着要执行管理存储过程,您需要同时拥有该存储过程的 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 权限。

为了让用户能够执行所有管理存储过程,他们可以被授予每个管理存储过程的上述两个权限(这需要在每次添加新的管理存储过程时进行更新),被授予所有存储过程的权限(这也会影响所有非管理存储过程),或者被授予 EXECUTE ADMIN PROCEDURES 权限。

EXECUTE ADMIN PROCEDURES 权限等同于在每个管理存储过程上授予 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 权限。这还有一个额外的好处,即任何新添加的 admin 存储过程都会自动包含在此权限中。
例如:

GRANT EXECUTE ADMIN PROCEDURES ON DBMS TO adminProcedureExecutor;

拥有 adminProcedureExecutor 角色的用户可以以提升的权限运行任何 admin 存储过程。因此,adminProcedureExecutor 角色拥有的权限允许执行所有管理存储过程。要以命令形式列出 adminProcedureExecutor 角色的所有权限,请使用以下查询

SHOW ROLE adminProcedureExecutor PRIVILEGES AS COMMANDS;
表 8. 结果
command(命令)

"GRANT EXECUTE ADMIN PROCEDURES ON DBMS TO `adminProcedureExecutor`"

行:1

为了将其与 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 权限进行比较,请重新审视 myProc 存储过程,但这次将其作为 admin 存储过程,当允许执行时,它将给出结果 ABC

如果用户仅被授予 EXECUTE PROCEDURE myProcEXECUTE BOOSTED PROCEDURE myProc 权限,则不允许执行 myProc 存储过程。

然而,对于被授予 EXECUTE ADMIN PROCEDURES 或同时被授予 EXECUTE PROCEDURE myProcEXECUTE BOOSTED PROCEDURE myProc 的用户,myProc 存储过程返回结果 ABC

任何被拒绝的 EXECUTE 权限都会导致无法执行该存储过程。在这种情况下,拒绝 EXECUTE PROCEDUREEXECUTE BOOSTED PROCEDURE 还是 EXECUTE ADMIN PROCEDURES 并不重要。

授予执行用户自定义函数的权限

您可以使用 EXECUTE USER DEFINED FUNCTION 权限授予执行用户自定义函数 (UDF) 的权限。拥有此权限的角色可以执行符合 名称通配 规则的 UDF。

EXECUTE USER DEFINED FUNCTION 权限不适用于内置函数,内置函数始终可执行。

授予执行部分用户自定义函数的权限

以下查询展示了如何授予 EXECUTE USER DEFINED FUNCTION 权限的示例

GRANT EXECUTE USER DEFINED FUNCTION apoc.coll.* ON DBMS TO functionExecutor;

或者使用简写形式

GRANT EXECUTE FUNCTION apoc.coll.* ON DBMS TO functionExecutor;

拥有 functionExecutor 角色的用户因此可以运行 apoc.coll 命名空间中的任何 UDF。函数将使用用户自身的权限进行执行。

因此,functionExecutor 角色拥有的权限仅允许执行 apoc.coll 命名空间中的 UDF。要以命令形式列出 functionExecutor 角色的所有权限,请使用以下查询

SHOW ROLE functionExecutor PRIVILEGES AS COMMANDS;
表 9. 结果
command(命令)

"GRANT EXECUTE FUNCTION apoc.coll.* ON DBMS TO `functionExecutor`"

行:1

授予除少数用户自定义函数外执行所有函数的权限

要允许执行除少数几个 UDF 之外的所有 UDF,您可以授予 EXECUTE USER DEFINED FUNCTIONS * 并拒绝不需要的 UDF。例如,以下查询允许执行所有 UDF,除了那些以 apoc.any.prop 开头的 UDF

GRANT EXECUTE USER DEFINED FUNCTIONS * ON DBMS TO deniedFunctionExecutor;
DENY EXECUTE USER DEFINED FUNCTION apoc.any.prop* ON DBMS TO deniedFunctionExecutor;

或者使用简写形式

GRANT EXECUTE FUNCTIONS * ON DBMS TO deniedFunctionExecutor;
DENY EXECUTE FUNCTION apoc.any.prop* ON DBMS TO deniedFunctionExecutor;

因此,deniedFunctionExecutor 角色拥有的权限仅允许执行除以 apoc.any.prop 开头之外的所有 UDF。函数将使用用户自身的权限进行执行。要以命令形式列出 deniedFunctionExecutor 角色的所有权限,请使用以下查询

SHOW ROLE deniedFunctionExecutor PRIVILEGES AS COMMANDS;
表 10. 结果
command(命令)

"DENY EXECUTE FUNCTION apoc.any.prop* ON DBMS TO `deniedFunctionExecutor`"

"GRANT EXECUTE FUNCTION * ON DBMS TO `deniedFunctionExecutor`"

行:2

apoc.any.propertyapoc.any.properties 被阻止,以及任何其他以 apoc.any.prop 开头的 UDF。

授予以提升权限执行用户自定义函数的权限

您可以使用 EXECUTE BOOSTED USER DEFINED FUNCTION 权限授予以提升权限执行用户自定义函数 (UDF) 的权限。
拥有此权限的用户在执行符合 名称通配 规则的 UDF 时,将不受其其他权限的限制。EXECUTE BOOSTED USER DEFINED FUNCTION 权限仅影响权限提升,而不影响函数本身的执行。因此,还需要为这些 UDF 授予 EXECUTE USER DEFINED FUNCTION 权限。要以提升的权限执行函数,必须同时拥有 EXECUTE USER DEFINED FUNCTIONEXECUTE BOOSTED USER DEFINED FUNCTION 权限。

EXECUTE BOOSTED USER DEFINED FUNCTION 权限不适用于内置函数,因为它们没有权限提升的概念。

授予以提升权限执行部分用户自定义函数的权限

以下查询展示了如何授予 EXECUTE BOOSTED USER DEFINED FUNCTION 权限的示例

GRANT EXECUTE USER DEFINED FUNCTION * ON DBMS TO boostedFunctionExecutor;
GRANT EXECUTE BOOSTED USER DEFINED FUNCTION apoc.any.properties ON DBMS TO boostedFunctionExecutor;

或者使用简写形式

GRANT EXECUTE FUNCTION * ON DBMS TO boostedFunctionExecutor;
GRANT EXECUTE BOOSTED FUNCTION apoc.any.properties ON DBMS TO boostedFunctionExecutor;

拥有 boostedFunctionExecutor 角色的用户因此可以以完全权限运行 apoc.any.properties,并查看节点/关系上的所有属性,而不仅仅是用户拥有 READ 权限的属性。如果没有 EXECUTE USER DEFINED FUNCTION,则根本无法执行任何 UDF。

因此,boostedFunctionExecutor 角色拥有的权限允许以提升的权限执行 UDF apoc.any.properties,并使用用户自身的权限执行所有其他 UDF。要以命令形式列出 boostedFunctionExecutor 角色的所有权限,请使用以下查询

SHOW ROLE boostedFunctionExecutor PRIVILEGES AS COMMANDS;
表 11. 结果
command(命令)

"GRANT EXECUTE FUNCTION * ON DBMS TO `boostedFunctionExecutor`"

"GRANT EXECUTE BOOSTED FUNCTION apoc.any.properties ON DBMS TO `boostedFunctionExecutor`"

行:2