你想要做的是合理的。您的Web应用程序应以用户身份(如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。
其实谁/如何创建一个新用户? –