PostgreSQL是通過角色來管理資料庫存取權限的,我們可以將一個角色看成是一個資料庫使用者,或者一組資料庫使用者。角色可以擁有資料庫物件,如表、索引,也可以把這些對象上的許可權賦予其它角色,以控制哪些使用者對哪些對象擁有哪些許可權。
一、資料庫角色:
1. 建立角色:
CREATE ROLE role_name;
2. 刪除角色:
DROP ROLE role_name;
3. 查詢角色:
檢查系統資料表pg_roles,如:
SELECT rolname FROM pg_roles;
也可以在psql中執行\du命令列出所有角色。
二、角色屬性:
一個資料庫角色可以有一系列屬性,這些屬性定義他的許可權,以及與客戶認證系統的互動。
1. 登入許可權:
只有具有LOGIN屬性的角色才可以用於資料庫連接,因此我們可以將具有該屬性的角色視為登入使用者,建立方法有如下兩種:
CREATE ROLE name LOGIN PASSWORD '123456‘;
CREATE USER name PASSWORD '123456';
2. 超級使用者:
資料庫的超級使用者擁有該資料庫的所有許可權,為了安全起見,我們最好使用非超級使用者完成我們的正常工作。和建立普通使用者不同,建立超級使用者必須是以超級使用者的身份執行以下命令:
CREATE ROLE name SUPERUSER;
3. 建立資料庫:
角色要想建立資料庫,必須明確賦予建立資料庫的屬性,見如下命令:
CREATE ROLE name CREATEDB;
4. 建立角色:
一個角色要想建立更多角色,必須明確給予建立角色的屬性,見如下命令:
CREATE ROLE name CREATEROLE;
三、許可權:
資料庫物件在被建立時都會被賦予一個所有者,通常而言,所有者就是執行對象建立語句的角色。對於大多數類型的對象,其初始狀態是只有所有者(或超級使用者)可以對該對象做任何事情。如果要允許其它使用者可以使用該對象,必須賦予適當的許可權。PostgreSQL中預定義了許多不同類型的內建許可權,如:SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。
我們可以使用GRANT命令來賦予許可權,如:
GRANT UPDATE ON accounts TO joe;
對於上面的命令,其含義為將accounts表的update許可權賦予joe角色。此外,我們也可以用特殊的名字PUBLIC把對象的許可權賦予系統中的所有角色。在許可權聲明的位置上寫ALL,表示把適用於該對象的所有許可權都賦予目標角色。
要撤銷許可權,使用合適的REVOKE命令:
REVOKE ALL ON accounts FROM PUBLIC;
其含義為:對所有角色(PUBLIC)撤銷在accounts對象上的所有許可權(ALL)。
四、角色成員:
在系統的使用者管理中,通常會把多個使用者賦予一個組,這樣在設定許可權時只需給該組設定即可,撤銷許可權時也是從該組撤消。在PostgreSQL中,首先需要建立一個代表組的角色,之後再將該角色的membership許可權賦給獨立的使用者角色即可。
1. 建立一個組角色,通常而言,該角色不應該具有LOGIN屬性,如:
CREATE ROLE name;
2. 使用GRANT和REVOKE命令添加和撤消許可權:
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
一個角色成員可以通過兩種方法使用組角色的許可權,如:
1. 每個群組成員都可以用SET ROLE命令將自己臨時"變成"該群組成員,此後再建立的任何對象的所有者將屬於該組,而不是原有的登入使用者。
2. 擁有INHERIT屬性的角色成員自動繼承它們所屬角色的許可權。
見如下樣本:
CREATE ROLE joe LOGIN INHERIT; --INHERIT是預設屬性。
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
現在我們以角色joe的身份與資料庫建立串連,那麼該資料庫會話將同時擁有角色joe和角色admin的許可權,這是因為joe"繼承 (INHERIT)"了admin的許可權。然而與此不同的是,賦予wheel角色的許可權在該會話中將不可用,因為joe角色只是wheel角色的一個間接成員,它是通過admin角色間接傳遞過來的,而admin角色卻含有NOINHERIT屬性,這樣wheel角色的許可權將無法被joe繼承。
這樣wheel角色的許可權將無法被joe繼承。此時,我們可以在該會話中執行下面的命令:
SET ROLE admin;
在執行之後,該會話將只擁有admin角色的許可權,而不再包括賦予joe角色的許可權。同樣,在執行下面的命令之後,該會話只能使用賦予wheel的許可權。
SET ROLE wheel;
在執行一段時間之後,如果仍然希望將該會話恢複為原有許可權,可以使用下列恢複方式之一:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
注意: SET ROLE命令總是允許選取當前登入角色的直接或間接組角色。因此,在變為wheel之前沒必要先變成admin。
角色屬性LOGIN、SUPERUSER和CREATEROLE被視為特殊許可權,它們不會像其它資料庫物件的普通許可權那樣被繼承。如果需要,必須在調用SET ROLE時顯式指定擁有該屬性的角色。比如,我們也可以給admin角色賦予CREATEDB和CREATEROLE許可權,然後再以joe的角色串連資料庫,此時該會話不會立即擁有這些特殊許可權,只有當執行SET ROLE admin命令之後當前會話才具有這些許可權。
要刪除一個組角色,執行DROP ROLE group_role命令即可。然而在刪除該組角色之後,它與其成員角色之間的關係將被立即撤銷(成員角色本身不會受影響)。不過需要注意的是,在刪除之前,任何屬於該組角色的對象都必須先被刪除或者將對象的所有者賦予其它角色,與此同時,任何賦予該組角色的許可權也都必須被撤消。
轉載自Stephen Liu,僅做學習收藏用途。