在 postgres 上创建角色

Role creation on postgres

我正在为图书馆开发一个小型数据库,但我对角色和权限一无所知。 我花了很多时间在谷歌上搜索,但我仍然没有真正了解这些机制。 我的目标是创建 3 个基本角色:

起初我想我可以创建这 3 个角色,指定每个角色拥有的各种权限,然后在相关网站上,每次有人连接时,他都会被视为 "User with no login",直到登录会确定他是否是管理员;阅读 PostgreSQL 文档后,我明白它不是这样的,或者我弄错了。 我真的不知道该怎么做,任何帮助将不胜感激。

你想做的事情是合理的。您的 webapp 应该以标记为 NOINHERIT 的用户身份(例如 mywebapp)使用其连接池登录,并且除了 SET ROLE 之外没有其他三个角色的权限。这些角色中的每一个都描述了您上面提到的用户类别之一。您还需要 GRANT 访问任何 table 的权利,这些 table 用于向 mywebapp 用户查找和验证用户。

在为请求提供服务时,如果它代表匿名用户,它会执行 SET ROLE anonymous_web_user; 或其他任何操作。

如果它作为指定用户,它会 SET ROLE authenticated_user;。您将 GRANT 有权阅读您用于对 mywebapp 角色的用户进行身份验证的 table,以便它可以以您的应用程序执行的任何方式对他们进行身份验证。

如果它充当管理员,它会 SET ROLE admin;。或者,如果管理员不多并且他们需要不同的权限,您可以让他们成为 PostgreSQL 用户,并且 SET ROLE the_admin_user_name;。同样,您的应用程序会预先对它们进行身份验证,并且 SET ROLE 如果它对用户的身份验证感到满意。

当连接返回到池中时,池 运行 查询 DISCARD ALL; 清除连接的角色设置是 至关重要的

因此,例如,您可以:

CREATE ROLE mywebapp WITH LOGIN NOINHERIT;
CREATE ROLE anonymous_web_user;
CREATE ROLE authenticated_user;
CREATE ROLE admin_user;

-- 'mywebapp' can become anyone, but by default doesn't
-- get the rights of any of them since it's marked NOINHERIT
GRANT admin_user TO mywebapp;
GRANT anonymous_web_user TO mywebapp;
GRANT authenticated_user TO mywebapp;

-- All admins are authenticated users, since authenticated_user
-- is INHERITable
GRANT authenticated_user TO admin_user;

-- All authenticated users have the rights of anon users too
GRANT anonymous_web_user TO authenticated_user;

-- The app must be able to look up users
GRANT SELECT ON some_users_table TO mywebapp;
-- but only admins can change them
GRANT ALL ON some_users_table TO admin_user;

...

参见 Role membership