2

继我的问题之后, 如何在 Firebird 2.5.8 上撤销另一个用户授予的角色?

和@Arioch 的有用建议是在命令之前查询实际连接的角色。

SELECT CURRENT_ROLE FROM RDB$DATABASE

现在,尽管我的连接字符串明确使用“ROLE=RDB$ADMIN”,但在 gsec 中检查给定用户是否具有管理员选项,但当我运行命令时结果为 NONE。这是使用 Firebird ADO.NET FirebirdSql.Data.FirebirdClient 接口 v6.6。

所以我使用FlameRobin进行了类似的检查,使用相同的用户和指定的RDB$ADMIN ROLE登录,结果是一样的:

在此处输入图像描述

关于为什么不返回'RDB $ ADMIN'的任何想法我做错了什么?

4

1 回答 1

3

由于在特定数据库中授予用户权限,因此该用户必须是该特定数据库中的 RDB$ADMIN 并且必须在连接时指定角色。用户在 GSEC 中具有管理员角色仅意味着用户在安全数据库中具有管理员角色。这并不意味着他们在特定数据库中具有管理员角色。

CURRENT_ROLE返回的事实NONE意味着用户要么没有指定角色,要么没有在当前数据库中被授予 RDB$ADMIN 角色。

引用Firebird Language Reference, User Authentication, RDB$ADMIN Role

内部创建的角色 RDB$ADMIN 存在于每个数据库中。将 RDB$ADMIN 角色分配给数据库中的普通用户会授予该用户在当前数据库中的 SYSDBA 权限。

当用户以 RDB$ADMIN 角色登录到该常规数据库并完全控制数据库中的所有对象时,提升的权限就会生效。

在安全数据库中被授予 RDB$ADMIN 角色授予创建、编辑和删除用户帐户的权限。

要通过 SQL 管理用户帐户,被授权者必须在连接时指定 RDB$ADMIN 角色。没有用户可以连接到安全数据库,所以解决方案是用户连接到一个他也有 RDB$ADMIN 权限的常规数据库,在他的登录参数中提供 RDB$ADMIN 角色。从那里,他可以提交任何 SQL 用户管理命令。

该用户的 SQL 路由对于他没有被授予 RDB$ADMIN 角色的任何数据库都被阻止。

GRANT ADMIN ROLE子句仅适用于安全数据库(特别适用于CREATE/ALTER/DROP USERSQL 用户管理语句),并且仅当用户通过普通数据库进行连接时,他们还具有 RDB$ADMIN 角色,在连接时指定该角色。

要在特定数据库中授予用户管理员权限,他们需要已被授予该角色 - 在该特定数据库中 - 使用:

GRANT [ROLE] RDB$ADMIN TO username

他们需要在连接上指定角色。

于 2019-08-16T07:17:51.380 回答