PostgreSQL中NOLOGIN用户的用途是什么?

4

我正在尝试理解PostgREST教程的初始步骤。

在提到的教程中,建议按以下方式创建两个不同的角色,分别命名为web_anonauthenticator

create role web_anon nologin;

grant usage on schema api to web_anon;
grant select on api.todos to web_anon;

create role authenticator noinherit login password 'mysecretpassword';
grant web_anon to authenticator;

据我所知,PostgREST服务器从客户端接收Rest API请求,没有任何关于用户(角色)的信息。而且,据我所知,无法登录到数据库的nologin角色。(他们能发送查询吗?)
所以问题是:
1.我们为什么需要两个不同的角色? web_anon的角色是什么,authenticator的角色是什么?
2.nologin角色在postgres中能做什么?
3.PostgREST接收rest API查询时,使用哪个用户将查询发送和执行到数据库?

https://www.postgresql.org/docs/current/database-roles.html - user330315
1
这并没有在链接的教程中提到,但是PostgREST文档解释了为什么需要这些角色http://postgrest.org/en/v6.0/auth.html#authentication-sequence。 - Steve Chavez
1个回答

8

问题1:

NOLOGIN角色可以被视为用户组。其思想是将所有权限附加到一个组而不是单独的用户上,这有几个优点:

  • 可以删除用户,因为它没有任何权限。

  • 将用户添加到组或将用户从组中删除比每次添加用户或更改其权限时授予或撤销许多权限更简单。

  • 不会出现将太多单独的ACL条目附加到单个数据库对象以至于无法添加更多权限的危险(整个元数据行必须适合单个8kB块)。

只有在数据库中有很多用户时,这整个练习才有意义,否则就是愚蠢的。但是,为不同的目的使用不同的用户是个好主意。

问题2:

NOLOGIN角色既可以是一个携带用户可以继承的权限的组。

另一种用法是您可以使用SET ROLE来假定该角色的身份。

问题3:

我想使用PostgreSQL连接字符串中的任何用户。


谢谢亲爱的Laurenz。_NOLOGIN_用户和_GROUP_之间有什么区别吗?我的意思是,既然已经有了组,为什么PostgreSQL开发人员还要引入_NOLOGIN_用户呢? - Ebrahim Ghasemi
1
PostgreSQL 中既没有用户也没有组,而是角色。您仍然可以使用“用户”表示“登录角色”,并使用“组”表示“无登录角色”。在我的回答中,我将这些术语视为同义词。 - Laurenz Albe
根据您的回答,我可以得出结论:Postgrest 只需要在其配置文件中使用具有 LOGIN 权限的用户名称,而不是 NOLOGIN 用户。对于教程中为什么两个用户的名称都写在配置文件中,您有任何想法吗? - Ebrahim Ghasemi
1
为了澄清第三个问题的答案,PostgREST不使用连接用户来发送查询。它通过“SET LOCAL ROLE”切换到“web_anon”角色以该角色身份发送查询。连接用户除了登录到数据库并切换到“web_anon”角色或您定义的其他角色外,没有其他特权。 - Steve Chavez
2
@LaurenzAlbe 不,PostgREST文档不建议使用相同的角色。 web_anon是一个"应用程序角色"(启用了RLS),为许多未经身份验证的Web应用程序用户提供服务。 LOGIN角色,例如 authenticator,是另一个问题。 LOGIN角色可能会轮换,但这不应影响应用程序角色。或者,可以为不同的应用程序使用相同的LOGIN,您可以拥有web_anon_for_app1web_anon_for_app2,两者具有不同的特权。这样说通了吗?我可以编辑您的答案,并总结一下。 - Steve Chavez
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接