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