我正在为图书馆开发一个小型数据库,但在角色和特权方面,我完全无知。 我花了很长时间在谷歌上搜索,但我仍然没有真正得到机制。 我的目标是创建3个基本角色:
起初我以为我可以创建这三个角色,指定每个人拥有的各种权限,然后,在相关网站上,每次有人连接时,他都会被认为是“没有登录的用户”。直到登录确定他是否是管理员;阅读PostgreSQL文档,我理解它并不是这样的,或者说我弄错了。 我真的不知道该怎么做,任何帮助都会受到赞赏。
答案 0 :(得分:0)
你想做的是合理的。您的网络应用程序应以其标记为mywebapp
的用户(例如NOINHERIT
)作为用户登录,并且除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。