?
このドキュメントでは、 php中國(guó)語(yǔ)ネットマニュアル リリース
把用戶(hù)組合起來(lái)簡(jiǎn)化權(quán)限管理是個(gè)常用的便利方法: 用這樣的方法,權(quán)限可以賦予整個(gè)組,也可以對(duì)整個(gè)組撤消。 在PostgreSQL里, 這些事情是通過(guò)創(chuàng)建代表一個(gè)組的角色, 然后賦予組角色的成員權(quán)限給獨(dú)立的用戶(hù)角色的方法實(shí)現(xiàn)的。
要設(shè)置一個(gè)組角色,首先創(chuàng)建角色:
CREATE ROLE name;
一般作為組使用的角色不應(yīng)當(dāng)具有LOGIN屬性,雖然你可以設(shè)置它。
一旦組角色已經(jīng)存在了,那么你就可以用 GRANT和REVOKE命令添加和撤消權(quán)限:
GRANT group_role TO role1, ... ; REVOKE group_role FROM role1, ... ;
你還可以賦予成員權(quán)限給其它組角色(因?yàn)樵诮M角色和非組角色之間沒(méi)有實(shí)質(zhì)的區(qū)別)。 唯一的制約是你不能建立循環(huán)的成員關(guān)系。另外,不允許給 PUBLIC角色賦予成員權(quán)限。
一個(gè)組角色的成員可以用兩種方法使用組角色的權(quán)限。 首先,一個(gè)組的每個(gè)成員都可以明確用SET ROLE 臨時(shí)"變成"該組的成員。 在這個(gè)狀態(tài)下,數(shù)據(jù)庫(kù)會(huì)話具有該組角色的權(quán)限,而不是原始的登錄角色權(quán)限, 這個(gè)時(shí)候創(chuàng)建的數(shù)據(jù)庫(kù)對(duì)象被認(rèn)為是由組角色擁有,而不是登錄角色。 第二,擁有INHERIT屬性的角色成員自動(dòng)具有它們所屬組角色的權(quán)限。 例如,假如我們做了下面的事情:
CREATE ROLE joe LOGIN INHERIT; CREATE ROLE admin NOINHERIT; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin;
那么在以角色joe連接之后,該數(shù)據(jù)庫(kù)會(huì)話將立即擁有直接賦予 joe的權(quán)限加上任何賦予admin的權(quán)限, 因?yàn)?tt class="LITERAL">joe"繼承"了admin的權(quán)限。不過(guò), 賦予 wheel 的權(quán)限不可用,因?yàn)榧词?tt class="LITERAL">joe是wheel 的一個(gè)間接成員, 但該成員關(guān)系是通過(guò)admin過(guò)來(lái)的,而該組有NOINHERIT 屬性。在
SET ROLE admin;
之后,該會(huì)話將只擁有那些已賦予admin的權(quán)限,而不包括那些已賦予joe的權(quán)限。在
SET ROLE wheel;
之后,該會(huì)話將只能使用已賦予wheel的權(quán)限,而不包括已賦予joe或admin的權(quán)限。 原來(lái)的權(quán)限可以用下列之一恢復(fù):
SET ROLE joe; SET ROLE NONE; RESET ROLE;
Note: SET ROLE命令總是允許選取任意登錄角色直接或者間接所 在的組角色。因此,在上面的例子里,我們沒(méi)必要在 變成wheel之前先變成admin。
Note: 在SQL標(biāo)準(zhǔn)里,在用戶(hù)和角色之間有明確的區(qū)別, 并且用戶(hù)并不會(huì)自動(dòng)繼承權(quán)限,而角色可以。 這個(gè)行為在PostgreSQL里面可以通過(guò)給予那些當(dāng)作 SQL 角色使用的角色以INHERIT 屬性, 而給予當(dāng)作SQL用戶(hù)使用的角色以 NOINHERIT屬性來(lái)實(shí)現(xiàn)。不過(guò), PostgreSQL缺省是給予所有角色 INHERIT 屬性,目的是和8.1之前的版本向下兼容, 那些版本里,用戶(hù)總是能使用他們所在組被賦予的權(quán)限。
角色屬性LOGIN, SUPERUSER, CREATEDB可以被認(rèn)為是特殊的權(quán)限, 但是它們從來(lái)不會(huì)像數(shù)據(jù)庫(kù)對(duì)象上的普通權(quán)限那樣繼承。 你必須明確地SET ROLE到一個(gè)特殊的角色, 這個(gè)角色應(yīng)該是擁有這些屬性的角色, 然后才能利用這些屬性。繼續(xù)上面的例子, 我們也可以選擇給admin角色賦予CREATEDB和CREATEROLE 權(quán)限。然后,以joe連接的會(huì)話不會(huì)立即有這些權(quán)限, 只有在SET ROLE admin之后才有。
要?jiǎng)h除一個(gè)組角色,用DROP ROLE命令:
DROP ROLE name;
任何在組角色里面的成員關(guān)系都會(huì)自動(dòng)撤消(但是成員角色自己則不受影響)。 不過(guò),請(qǐng)注意任何組角色擁有的對(duì)象都必須首先刪除或者賦予其它所有者; 并且任何給該組角色賦予的權(quán)限都必須撤消。