主頁(yè) > 知識(shí)庫(kù) > Postgresql 數(shù)據(jù)庫(kù)權(quán)限功能的使用總結(jié)

Postgresql 數(shù)據(jù)庫(kù)權(quán)限功能的使用總結(jié)

熱門(mén)標(biāo)簽:無(wú)錫梁溪公司怎樣申請(qǐng)400電話 江西穩(wěn)定外呼系統(tǒng)供應(yīng)商 孝感銷(xiāo)售電銷(xiāo)機(jī)器人廠家 北京智能外呼系統(tǒng)供應(yīng)商家 中國(guó)地圖標(biāo)注省份用什么符號(hào) 奧維地圖標(biāo)注字體大小修改 電話機(jī)器人錄音師薪資 智能電銷(xiāo)機(jī)器人教育 高德地圖標(biāo)注電話怎么沒(méi)了

Postgresql數(shù)據(jù)庫(kù)支持靈活的權(quán)限管理,可以控制一個(gè)角色(組、用戶(hù))對(duì)某張表的讀、寫(xiě)、更新、刪除等操作權(quán)限、執(zhí)行某個(gè)函數(shù)的權(quán)限以及操作(使用、更新等)視圖、序列的權(quán)限。

PG的權(quán)限管理功能比較強(qiáng)大,可以細(xì)化到對(duì)一張表的各個(gè)字段,比如禁止用戶(hù)訪問(wèn)一張表里的密碼字段等,在稍后的內(nèi)容中給出詳細(xì)的解釋。

雖然在PG數(shù)據(jù)庫(kù)中把用戶(hù)、角色統(tǒng)一叫做角色,甚至創(chuàng)建語(yǔ)句都為create role XXX,但用戶(hù)和角色之間仍有一定的區(qū)別。在這里我們統(tǒng)一把擁有登錄權(quán)限的叫做用戶(hù),沒(méi)有登錄權(quán)限的叫做角色,用此方式加以區(qū)分。

實(shí)際上,在PgAdmin管理工具中,可以看到用戶(hù)和角色的區(qū)別,沒(méi)有登錄權(quán)限的被放在組角色下,有登錄權(quán)限的被放在登錄角色下。

基本權(quán)限

用戶(hù)和角色都可以被賦予基本權(quán)限,比如創(chuàng)建數(shù)據(jù)庫(kù)權(quán)限、超級(jí)用戶(hù)權(quán)限、創(chuàng)建角色權(quán)限等。

比如創(chuàng)建用戶(hù)的語(yǔ)句為:

CREATE ROLE guest LOGIN
 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

注意上述Role guest擁有LOGIN的權(quán)限,所以叫它用戶(hù)。

創(chuàng)建角色的語(yǔ)句為:

CREATE ROLE "group"
 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

注意這里沒(méi)有LOGIN權(quán)限,所以是角色。

上述角色和用戶(hù)的創(chuàng)建語(yǔ)句中,都沒(méi)有賦予超級(jí)用戶(hù)、創(chuàng)建數(shù)據(jù)庫(kù)等權(quán)限。

操作數(shù)據(jù)庫(kù)對(duì)象權(quán)限

只能把數(shù)據(jù)庫(kù)對(duì)象的操作權(quán)限賦予沒(méi)有登錄權(quán)限的角色,而不能直接賦予擁有登錄權(quán)限的用戶(hù)。

那么這樣就帶來(lái)一個(gè)問(wèn)題,怎么樣控制登錄用戶(hù)操作數(shù)據(jù)庫(kù)對(duì)象的權(quán)限呢?

答案是讓用戶(hù)成為角色的成員,此時(shí)用戶(hù)即可擁有角色的權(quán)限,進(jìn)一步限制了登錄用戶(hù)操作數(shù)據(jù)庫(kù)對(duì)象的權(quán)限。

如把上述角色group賦予guest用戶(hù):

GRANT "group" TO guest;

之后,guest用戶(hù)就擁有了group角色所擁有的數(shù)據(jù)庫(kù)對(duì)象權(quán)限。

比如控制group角色只能對(duì)class表執(zhí)行Insert操作:

GRANT INSERT ON TABLE class TO "group";

此時(shí)使用guest用戶(hù)登錄數(shù)據(jù)后,就只能對(duì)表class執(zhí)行insert操作,無(wú)法執(zhí)行delete、update等操作。

示例代碼如下,使用guest用戶(hù)登錄,訪問(wèn)TEST數(shù)據(jù)庫(kù)下的class表。

Server [localhost]:
Database [postgres]:
Port [5433]:
Username [postgres]: guest
用戶(hù) guest 的口令:
psql (9.4.5)
輸入 "help" 來(lái)獲取幫助信息.
postgres=> \c TEST
您現(xiàn)在已經(jīng)連線到數(shù)據(jù)庫(kù) "TEST",用戶(hù) "guest".
TEST=> select * from class;
ERROR: permission denied for relation class
TEST=> insert into class values(2,'class1');
INSERT 0 1

從上述結(jié)果中可以看到,guest用戶(hù)沒(méi)有權(quán)限查詢(xún)class表,但是可以插入數(shù)據(jù)庫(kù)。原因就是只對(duì)group角色賦予了class表的insert權(quán)限,然后guest用戶(hù)也就只有class表的insert權(quán)限。

前面說(shuō)到PG的權(quán)限管理可以細(xì)化到表的某個(gè)字段,現(xiàn)在繼續(xù)用class表和guest用戶(hù)做實(shí)驗(yàn)。

TEST=> \c postgres postgres;
您現(xiàn)在已經(jīng)連線到數(shù)據(jù)庫(kù) "postgres",用戶(hù) "postgres".
postgres=# \c TEST;
您現(xiàn)在已經(jīng)連線到數(shù)據(jù)庫(kù) "TEST",用戶(hù) "postgres".
TEST=# grant select(num) on class to "group";
GRANT
TEST=# \echo 切換到postgres用戶(hù)連接TEST數(shù)據(jù)庫(kù),對(duì)class表的num字段的select權(quán)限賦予group角色
切換到postgres用戶(hù)連接TEST數(shù)據(jù)庫(kù),對(duì)class表的num字段的select權(quán)限賦予group角色
TEST=# \c TEST guest
用戶(hù) guest 的口令:
您現(xiàn)在已經(jīng)連線到數(shù)據(jù)庫(kù) "TEST",用戶(hù) "guest".
TEST=> \echo 切換回guest用戶(hù)登錄TEST數(shù)據(jù)庫(kù)
切換回guest用戶(hù)登錄TEST數(shù)據(jù)庫(kù)
TEST=> select * from class;
ERROR: permission denied for relation class
TEST=> select num from class;
 num
-----
  1
  2
(2 行記錄)

從上述結(jié)果中可以看到,guest用戶(hù)依然沒(méi)有查詢(xún)class表的權(quán)限,但是卻有了查詢(xún)class表里的num字段的權(quán)限。

在PG數(shù)據(jù)庫(kù)中不單單可以控制操作表的權(quán)限,其他數(shù)據(jù)庫(kù)對(duì)象,比如序列、函數(shù)、視圖等都可以控制。

所以PG的權(quán)限控制功能非常強(qiáng)大。

補(bǔ)充:Postgres用戶(hù)對(duì)數(shù)據(jù)庫(kù)的權(quán)限

用戶(hù)對(duì)數(shù)據(jù)庫(kù)的權(quán)限(登錄、超級(jí)用戶(hù)權(quán)限)

(1)查看當(dāng)前數(shù)據(jù)庫(kù)中有用戶(hù)highgo和用戶(hù)a

highgo=#\du
               List of roles
 Role name |          Attributes          | Member of
-----------+------------------------------------------------+-----------
 a     |                        | {}
 highgo  | Superuser, Create role, Create DB, Replication | {}

(2)查看確認(rèn)當(dāng)前連接的用戶(hù)為超級(jí)用戶(hù)highgo,且該用戶(hù)后創(chuàng)建角色和數(shù)據(jù)庫(kù)的權(quán)限等

highgo=#select current_user;
 current_user
--------------
 highgo
(1row)

(3)查看當(dāng)前集群中的數(shù)據(jù)庫(kù)

highgo=#\l
               List of databases
  Name  | Owner | Encoding | Collate |  Ctype  | Access privileges
-----------+--------+----------+------------+------------+-------------------
 highgo  | highgo | UTF8   | zh_CN.utf8 |zh_CN.utf8 |
 template0 | highgo | UTF8   | zh_CN.utf8 | zh_CN.utf8 | =c/highgo    +
      |    |     |      |      | highgo=CTc/highgo
 template1 | highgo | UTF8   | zh_CN.utf8 | zh_CN.utf8 | =c/highgo    +
      |    |     |      |      | highgo=CTc/highgo
(3rows)

(4)使用普通用戶(hù)a連接數(shù)據(jù)庫(kù)正常

highgo=#\c highgo a
Youare now connected to database "highgo" as user "a".
highgo=>select current_user;
 current_user
--------------
 a
(1row)
(5)使用超級(jí)用戶(hù)highgo連接數(shù)據(jù)庫(kù)正常
highgo=>\c highgo highgo
Youare now connected to database "highgo" as user "highgo".
highgo=#select current_user;
 current_user
--------------
 highgo
(1row)

(6)在超級(jí)用戶(hù)連接highgo后,設(shè)置不允許普通用戶(hù)a連接數(shù)據(jù)庫(kù)

highgo=#alter role a nologin;
ALTER ROLE
highgo=#\c highgo a
致命錯(cuò)誤: 不允許角色"a" 進(jìn)行登錄
Previousconnection kept
highgo=#

(7)在超級(jí)用戶(hù)連接highgo后,設(shè)置不允許普通用戶(hù)a連接數(shù)據(jù)庫(kù)后,賦予用戶(hù)a超級(jí)用戶(hù)權(quán)限后仍然無(wú)法連接數(shù)據(jù)庫(kù)

highgo=#alter role a superuser;
ALTERROLE
highgo=#\du
               List of roles
 Role name |          Attributes          | Member of
-----------+------------------------------------------------+-----------
 a    | Superuser, Cannot login            | {}
 highgo  | Superuser, Create role, Create DB, Replication | {}
 
highgo=#\c highgo a
致命錯(cuò)誤: 不允許角色"a" 進(jìn)行登錄
Previousconnection kept

(8)將登錄數(shù)據(jù)庫(kù)的權(quán)限賦予用戶(hù)a后,用戶(hù)a可登錄數(shù)據(jù)庫(kù)

highgo=#alter role a login;
ALTERROLE
highgo=#\c highgo a
Youare now connected to database "highgo" as user "a".
highgo=#select current_user;
 current_user
--------------
 a
(1row)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 基于PostgreSQL 權(quán)限解讀
  • PostgreSQL 默認(rèn)權(quán)限查看方式
  • Postgresql 賦予用戶(hù)權(quán)限和撤銷(xiāo)權(quán)限的實(shí)例
  • 查看postgresql數(shù)據(jù)庫(kù)用戶(hù)系統(tǒng)權(quán)限、對(duì)象權(quán)限的方法
  • PostgreSQL教程(十二):角色和權(quán)限管理介紹
  • 用一整天的時(shí)間安裝postgreSQL NTFS權(quán)限

標(biāo)簽:泰州 齊齊哈爾 那曲 阜陽(yáng) 臨滄 荊州 通化 海北

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Postgresql 數(shù)據(jù)庫(kù)權(quán)限功能的使用總結(jié)》,本文關(guān)鍵詞  Postgresql,數(shù)據(jù)庫(kù),權(quán)限,功能,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Postgresql 數(shù)據(jù)庫(kù)權(quán)限功能的使用總結(jié)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Postgresql 數(shù)據(jù)庫(kù)權(quán)限功能的使用總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章