你想要做的是合理的。您的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。
其實誰/如何創建一個新用戶? –