2015-09-05 80 views
2

我正在開發一個庫的小型數據庫,但對於角色和權限我完全無知。 我花了相當一段時間的搜索,但我仍然沒有真正得到機制。 我的目標是創建3個基本角色:在postgres上創建角色

  • 用戶沒有登錄(不是一個真正的用戶,只是有人誰希望看到圖書館在店內的書,但他不能做任何動作,除了剛看)
  • 用戶的登錄(他可以預購書,做其他動作)
  • 管理員(他可以添加新的書籍,作者,流派,可以給管理員權限的其他用戶)

在第一我想我可以創建這3個角色,每個角色指定不同的權限然後在相關的網站上,每次有人連接時,他將被認爲是「沒有登錄的用戶」,直到確定他是否是管理員的登錄名爲止;閱讀PostgreSQL文檔我知道這不是這樣,或者我錯了。 我真的不知道該怎麼做,任何幫助將不勝感激。

+0

其實誰/如何創建一個新用戶? –

回答

0

你想要做的是合理的。您的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