Postgresql 數(shù)據(jù)庫(kù)權(quán)限功能的使用總結(jié)
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ù)訪(fǎng)問(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ù)登錄,訪(fǎng)問(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)連線(xiàn)到數(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)連線(xiàn)到數(shù)據(jù)庫(kù) "postgres",用戶(hù) "postgres". postgres=# \c TEST; 您現(xiàn)在已經(jīng)連線(xiàn)到數(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)連線(xiàn)到數(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 USAGE和SELECT權(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)限
- 如何在PostgreSQL中創(chuàng)建只讀權(quán)限和讀寫(xiě)權(quán)限的賬號(hào)
相關(guān)文章
在postgresql中結(jié)束掉正在執(zhí)行的SQL語(yǔ)句操作
這篇文章主要介紹了在postgresql中結(jié)束掉正在執(zhí)行的SQL語(yǔ)句操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08PostgreSQL 存儲(chǔ)過(guò)程的進(jìn)階講解(含游標(biāo)、錯(cuò)誤處理、自定義函數(shù)、事務(wù))
PL/pgSQL 游標(biāo)允許我們封裝一個(gè)查詢(xún),然后每次處理結(jié)果集中的一條記錄,這篇文章主要介紹了PostgreSQL 存儲(chǔ)過(guò)程的進(jìn)階介紹(含游標(biāo)、錯(cuò)誤處理、自定義函數(shù)、事務(wù)),需要的朋友可以參考下2023-03-03postgresql 查詢(xún)集合結(jié)果用逗號(hào)分隔返回字符串處理的操作
這篇文章主要介紹了postgresql 查詢(xún)集合結(jié)果用逗號(hào)分隔返回字符串處理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02PostgreSql 的hash_code函數(shù)的用法說(shuō)明
這篇文章主要介紹了PostgreSql 的hash_code函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02淺談Postgresql默認(rèn)端口5432你所不知道的一點(diǎn)
這篇文章主要介紹了淺談Postgresql默認(rèn)端口5432你所不知道的一點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Postgresql 賦予用戶(hù)權(quán)限和撤銷(xiāo)權(quán)限的實(shí)例
這篇文章主要介紹了Postgresql 賦予用戶(hù)權(quán)限和撤銷(xiāo)權(quán)限的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01淺談PostgreSQL中大小寫(xiě)不敏感問(wèn)題
這篇文章主要介紹了淺談PostgreSQL中大小寫(xiě)不敏感問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01PostgreSQL關(guān)閉數(shù)據(jù)庫(kù)服務(wù)的三種模式
PostgreSQL 提供了三種關(guān)閉數(shù)據(jù)庫(kù)服務(wù)的不同方式,它們最終都是發(fā)送一個(gè)關(guān)閉信號(hào)到 postgres 主服務(wù)進(jìn)程,本文將給大家詳細(xì)的介紹一下這三種模式,需要的朋友可以參考下2024-07-07