【问题标题】:Role creation on postgres在 postgres 上创建角色
【发布时间】:2015-12-01 09:29:51
【问题描述】:
我正在为图书馆开发一个小型数据库,但我对角色和权限一无所知。
我花了很长时间在谷歌上搜索,但我仍然没有真正了解这些机制。
我的目标是创建 3 个基本角色:
- 没有登录的用户(不是真正的用户,只是想查看图书馆中的书籍,但除了观看之外无法执行任何操作的用户)
- 登录用户(他可以预订书籍并执行其他操作)
- 管理员(他可以添加新书、作者、流派,并且可以将管理员权限授予其他用户)
起初我以为我可以创建这 3 个角色,指定每个角色拥有的各种权限,然后,在相关网站上,每次有人连接时,他都会被视为“没有登录的用户”,直到登录'已经确定他是否是管理员;阅读 PostgreSQL 文档,我明白这不是这样的,或者我弄错了。
我真的不知道该怎么做,任何帮助将不胜感激。
【问题讨论】:
标签:
postgresql
phpmyadmin
roles
【解决方案1】:
你想做的事是合理的。您的 web 应用程序应该使用其连接池作为标记为 NOINHERIT 的用户(例如 mywebapp)登录,并且除了 SET ROLE 之外没有其他三个角色的权限。这些角色中的每一个都描述了您上面提到的用户类别之一。您还需要GRANT 访问用于查找和验证mywebapp 用户的任何表的权限。
在处理请求时,如果它代表匿名用户执行操作,它会执行 SET ROLE anonymous_web_user; 或其他任何操作。
如果它充当命名用户,它会执行SET ROLE authenticated_user;。您将拥有GRANT 读取用于将用户身份验证为mywebapp 角色的表格的权利,因此它可以以您的应用程序执行的任何方式对他们进行身份验证。
如果它以管理员身份运行,则为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。