PostgreSQL角色和許可權理解
阿新 • • 發佈:2019-01-09
1.繼承的許可權只是繼承該組的表的許可權,使用者對應的管理員許可權則不會被繼承。
2.inherit許可權是說本角色是否繼承別人的許可權,而不是本許可權能否被別的角色繼承。
postgres=# create role test0 createdb createrole login; CREATE ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} test0 | Create role, Create DB | {} test_role | | {} postgres=# \du+ List of roles Role name | Attributes | Member of | Description -----------+------------------------------------------------------------+-----------+------------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} | test0 | Create role, Create DB | {} | test_role | | {} | postgres=# create role test1 inherit; CREATE ROLE postgres=# grant test0 to test1; GRANT ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} test0 | Create role, Create DB | {} test1 | Cannot login| {test0} test_role | | {} postgres=# set role test0; SET postgres=> create table test0(id int); CREATE TABLE postgres=> set role test1; SET postgres=> insert into test0 select 1; INSERT 0 1 postgres=> set role test0; SET postgres=> set role postgres postgres-> ; SET postgres=# create role test2 login; CREATE ROLE postgres=# set role test2; SET postgres=> insert into test0 select 1; ERROR: permission denied for relation test0 postgres=> \d
轉自:https://www.cnblogs.com/baisha/p/8082783.html PostgreSQL是通過角色來管理資料庫訪問許可權的,我們可以將一個角色看成是一個數據庫使用者,或者一組資料庫使用者。角色可以擁有資料庫物件,如表、索引,也可以把這些物件上的許可權賦予其它角色,以控制哪些使用者對哪些物件擁有哪些許可權。 一、資料庫角色: 1. 建立角色: CREATE ROLE role_name; 2. 刪除角色: DROP ROLE role_name; 3. 查詢角色: 檢查系統表pg_role,如: SELECT usename FROM pg_role; 也可以在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命令即可。然而在刪除該組角色之後,它與其成員角色之間的關係將被立即撤銷(成員角色本身不會受影響)。不過需要注意的是,在刪除之前,任何屬於該組角色的物件都必須先被刪除或者將物件的所有者賦予其它角色,與此同時,任何賦予該組角色的許可權也都必須被撤消。