【问题标题】:Why does Firebird 2.5.8 return NONE on SELECT CURRENT_ROLE?为什么 Firebird 2.5.8 在 SELECT CURRENT_ROLE 上返回 NONE?
【发布时间】:2019-12-22 04:40:02
【问题描述】:

从我的问题开始 How to REVOKE ROLE GRANTED BY another user on 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”的任何想法我做错了什么?

【问题讨论】:

    标签: firebird firebird2.5 flamerobin


    【解决方案1】:

    由于在特定数据库中授予用户权限,因此该用户必须是该特定数据库中的 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 USER SQL 用户管理语句),并且仅当用户通过普通数据库进行连接时,他们还具有指定该角色的 RDB$ADMIN 角色连接。

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

    GRANT [ROLE] RDB$ADMIN TO username
    

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

    【讨论】:

    • 另外一件事是gsec 功能在FB3 中似乎有所减少(不能选择非默认安全提供程序),并且将在一天后完全禁用。由于主题发起人询问的是 FB3,他最好准备在工作流程中摆脱 gsec
    • @Arioch'gsec 已被弃用,如 Firebird 3 发行说明中所述。另一方面,考虑到 Firebird 如何处理其他已弃用的事物(例如方言 1),谁知道它需要多长时间才能真正消失。
    • 也许不会那么长......虽然我更喜欢他们宁愿延长它。另一个比较点可以是 FB3 中的 ODS 9.x 到 11.x
    猜你喜欢
    • 2022-01-21
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多