我正在为库开发一个小型数据库,但对于角色和特权,我完全不了解。我花了相当长的时间搜索,但我仍然没有真正得到机制。我的目标是创建三个基本角色:
起初,我想我可以创建这三个角色,指定每个角色所具有的各种特权,然后,在相关的网站上,每当有人连接时,他都会被认为是“没有登录的用户”,直到登录时才确定他是否是管理员;阅读PostgreSQL文档,我知道它不是这样的,或者我搞错了。我真的不知道该怎么做,任何帮助都将不胜感激。
发布于 2015-09-07 03:34:47
你想做的事是合理的。您的webapp应该以用户身份登录它的连接池(比如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;
...见角色成员资格。
https://stackoverflow.com/questions/32411330
复制相似问题