为啥 PostgreSQL 将用户和组合并为角色?

Posted

技术标签:

【中文标题】为啥 PostgreSQL 将用户和组合并为角色?【英文标题】:Why did PostgreSQL merge users and groups into roles?为什么 PostgreSQL 将用户和组合并为角色? 【发布时间】:2012-01-19 02:24:42 【问题描述】:

来自the PostgreSQL docs:

角色的概念包含“用户”和“组”的概念。在 PostgreSQL 8.1 之前的版本,用户和组是不同的种类 实体,但现在只有角色。任何角色都可以充当用户, 一组,或两者兼而有之。

他们为什么在 8.1 中做出这种改变?

也许从 C 编码人员的角度来看,使用单个角色类(结构)更容易?

More details:

CREATE USER is equivalent to CREATE ROLE except that CREATE USER 将登录权限授予用户/角色

(我即将为我的 webapp 设计一个权限系统,因此我对此很感兴趣。)

【问题讨论】:

【参考方案1】:

合并有很多优点,没有缺点。例如,您现在可以通过添加/删除LOGIN 权限将“用户”无缝转换为“组”,反之亦然。

ALTER ROLE myrole LOGIN;
ALTER ROLE myrole NOLOGIN;

或者您可以GRANT 以任何其他登录(“用户”)或非登录角色(“组”)的身份加入某个角色:

GRANT joe TO sue;

你仍然可以:

CREATE USER james;

现在只是role with login privilege。或者:

CREATE GROUP workers;

现在实际上是the same as CREATE ROLE

manual 拥有一切。

【讨论】:

【参考方案2】:

我发现this thread in the PostgreSQL-Hackers list,从 2003 年 6 月 6 日开始,最终建议合并用户、组和角色。 (感谢 Craig Ringer 建议我检查 pgsql-hackers 列表档案。)

以下是提到的一些好处(我发现的那些)。

允许群组拥有群组成员

ACL 代码将被简化

GRANT/REVOKE 语法和 ACL 列表的显示格式可以是 简化,因为不需要句法标记 给定名称是用户还是组。

在某些情况下,我认为允许登录是有意义的 直接作为一个组/角色/whatchacallit

这也将解决 information_schema 视图的问题 仅显示拥有的对象

[更容易]表示授予组的权限 [因为 你只是重用角色相关的代码?]

【讨论】:

【参考方案3】:

区分用户和组不会给您带来任何好处。

AFAIK 改变它的动机是为了简化如下用途:

一个用户伪装成另一个用户,例如一个超级用户模拟一个减少权限的用户。有了统一的角色,这只是当前角色的另一个变化,与更改主要组没有什么不同。

作为其他组成员的组以实现精细访问权限。

但是,如果您想了解详细信息,最好查看该时期 pgsql-hackers 列表的档案,以及 git 历史记录(从 CVS 转换而来)。

【讨论】:

感谢您推荐 pgsql-hackers 列表的档案。我找到了一个相关的帖子,并为这个问题添加了另一个答案。【参考方案4】:

来自manual:

SQL 标准定义了用户和角色的概念,但它 将它们视为不同的概念,并让所有命令定义 要由每个数据库实现指定的用户。在 PostgreSQL 中 我们选择将用户和角色统一为一种实体。 因此,角色比它们在 标准。

【讨论】:

那是你应该问做这件事的黑客,而不是像 SO 这样的论坛。 @FrankHeikens 那么你的回答完全没有抓住重点,你甚至知道......

以上是关于为啥 PostgreSQL 将用户和组合并为角色?的主要内容,如果未能解决你的问题,请参考以下文章

Python Keycloak 获取用户的角色和组

grails spring 安全角色和组

通过角色为 PostgreSQL 中的用户创建

Linux下用户和组管理

PostgreSQL之用户角色权限管理

PostgreSQL之用户角色权限管理