【发布时间】:2019-08-15 01:28:53
【问题描述】:
我正在使用 Firebird 2.5.8,ODS 版本 11.2,通过 Firebird ADO.NET v6.6 连接(在 C# 中使用 Visual Studio)。我已经构建了一个数据库管理工具来配置我们的表,以及执行一些基本的 Firebird 用户管理操作。数据库定义了不同的角色(MyRoleX 和 MyRoleY)来授予/限制访问权限。
用户管理操作包括将这些角色授予/撤销给不同的用户。登录到该工具后,连接使用 RDB$ADMIN ROLE,并且已使用 ADMIN ROLE 创建连接的用户。最后,可能有不止一个 Firebird 用户使用该工具(例如 Mgr1 和 Mgr2)。
好的,所以 Mgr1 创建了一个新用户,以及:
GRANT MyRoleX TO UserA;
GRANT MyRoleY TO UserA;
然后,Mgr1 下班/休假/不可用,并且 Mgr2 意识到不应授予 UserA MyRoleY。但是当 Mgr2 登录并尝试运行命令时:
REVOKE MyRoleY FROM UserA;
给出错误信息:
unsuccessful metadata update
Mgr2 is not grantor of Role on MyRoleY to UserA.
如果命令改为:
REVOKE MyRoleY FROM UserA GRANTED BY Mgr1;
然后给出错误信息:
unsuccessful metadata update
Only SYSDBA or database owner can use GRANTED BY clause.
虽然第二条消息很明确,但为什么如果 Mgr1 和 Mgr2 都使用 ROLE=RDB$ADMIN 连接(当然这些用户被授予 ADMIN ROLE),他们不能执行此操作吗?
来自Statements for Revoking Privileges ,在标题“撤销授予的权限”下,它指出:
当前用户必须以完全管理权限登录
如果在 RDB$ADMIN 下登录,那不是完全的管理员权限吗?
在标题'RDB$ADMIN Role'下的链接顶部,它还声明:
将 RDB$ADMIN 角色分配给数据库中的普通用户会授予该用户 SYSDBA 的权限。
那么为什么 Mgr2 有像 SYSDBA 这样的特权呢?
一些寻求答案的问题:
我在这里做错了吗?有没有办法连接或允许 Mgr2 撤销对 Mgr1 的 ROLE 的授予?
我们不想共享 SYSDBA 或数据库所有者凭据来执行这些操作,所以还有其他解决方案吗?
【问题讨论】:
-
我删除了你的第三个问题,因为它把范围扩大到“太宽泛”的领域。通常一个问题应该只包含一个问题,但其余两个问题密切相关,它们本质上是一个问题。
-
在撤销之前立即尝试
select CURRENT_ROLE from rdb$database- 连接真的获得了您认为的角色吗? -
感谢@Arioch'The 向我指出这一点(以及您在下方的回复)。我在 CURRENT_ROLE 的这个特定问题上创建了一个新帖子:stackoverflow.com/questions/57514744/…
-
尝试用你的工具重做我的实验。安装 FB 2.5.9(无论如何,你不会在 2.5.8 中得到任何修复,如果它会变成服务器错误,无论如何),然后使用你的编程语言和你的编程数据库库重现我的三个步骤序列实验。结果,我们可以专注于发现差异——无论是您和我们的环境之间的差异,还是这个正确工作的 3 连接操作序列与您的程序在失败时执行的一些不同序列之间的差异。您需要将标准具与您的程序进行比较并消除差异。
标签: firebird firebird2.5