【问题标题】:How to REVOKE ROLE GRANTED BY another user on Firebird 2.5.8?如何撤销 Firebird 2.5.8 上其他用户授予的角色?
【发布时间】: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 这样的特权呢?

一些寻求答案的问题:

  1. 我在这里做错了吗?有没有办法连接或允许 Mgr2 撤销对 Mgr1 的 ROLE 的授予?

  2. 我们不想共享 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


【解决方案1】:

由于 Firebird 2.5.9 发行说明没有提到任何与用户授权相关的错误修正,我想你误会了什么,可能你只是在使用 Mgr2 登录时没有调用RDB$ADMIN。在尝试撤销之前尝试查询活动角色。

刚刚在 Firebird 2.5.9 Win64 中使用 IBExpert 套件进行了尝试。

第一次会议:

/*** connected as SYSDBA with no role specified ***/
GRANT RDB$ADMIN TO ADM_1;
GRANT RDB$ADMIN TO ADM_2;
CREATE ROLE USER_ROLE;

第二次会议:

/*****  ADM_1 with RDB$ADMIN role specified *****/
select current_role, current_user from rdb$database;
-- ROLE         USER
-- RDB$ADMIN    ADM_1

grant user_role to user_1;
grant user_role to user_2 granted by sysdba;

第三次会议:

/*****  ADM_2 with RDB$ADMIN role specified *****/
select current_role, current_user from rdb$database;
-- ROLE         USER
-- RDB$ADMIN    ADM_2

revoke user_role from user_2 granted by sysdba;
-- OK

revoke user_role from user_1;
-- This operation is not defined for system tables.
-- unsuccessful metadata update.
-- ADM_2 is not grantor of Role on USER_ROLE to USER_1.

revoke user_role from user_1 granted by adm_1;
-- OK

所以,至少在 2.5.9 SuperServer 中只有一个数据库连接 - 它可以正常工作。

附:因为您可以拥有比两个更多的管理员,并且由于几个管理员可能会向用户授予一个角色,然后必须逐个找到并撤销这些授予中的每一个,所以我建议您针对您的场景有一个专门的然后是用户,所有赠款都以他的名义提供,就像我在第二次会话中对 SYSDBA 所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2017-01-14
    • 2016-09-16
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多