使用者角色管理
建立使用者角色
create user cjr LOGIN;
create role cjr1 CREATEDB;
create role cjr2 superuser;
create user cjr3 encrypted password '123456' valid until '2022-10-28';
create user admin with SUPERUSER password '123';
注: 屬性LOGIN、SUPERUSER和CREATEROLE被視為特殊權限,它們不會像其它資料庫對象的普通權限那樣被繼承。
加了WITH ADMIN OPTION 則允許被授予的使用者繼續将權限授予給其他人。
user\role差別
user 擁有login登陸資料庫權限的role

修改使用者
postgres=# alter user admin with password '1234';
通過 \help alter user
删除使用者
drop user username ;
drop role rolename;
DROP ROLE IF EXISTS
權限管理
每個資料庫對象都有一個所有者,預設情況下,所有者擁有該對象的所有權限
在資料庫中所有的權限都和角色挂鈎,postgresql權限分為兩部分:
“系統權限”或者資料庫使用者的屬性
資料庫對象上的操作權限(内置權限)
對超級使用者postgres不做權限檢查,其它使用者走ACL(Access ControL List)
對于資料庫對象,開始隻有所有者和超級使用者可以做任何操作,其它走ACL
可通過以下方式禁止使用者登入
ALTER ROLE c WITH NOLOGIN;
INHERIT該屬性使組成員擁有組的所有權限
ALTER ROLE
執行個體權限
主要由pg_hba.conf來控制,例如 :
TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 trust
host all postgres 0.0.0.0/0 reject
host all all 0.0.0.0/0 md5
以上配置的解釋
允許任何本地使用者無密碼連接配接任何資料庫
不允許postgres使用者從任何外部位址連接配接任何資料庫
允許其他任何使用者從外部位址通過密碼連接配接任何資料庫
庫級别權限
包括允許連接配接資料庫,允許在資料庫中建立schema。
預設情況下,資料庫在建立後
允許public角色連接配接,即允許任何人連接配接
不允許除了超級使用者和owner之外的任何人在資料庫中建立schema
會自動建立名為public 的schema,這個schema的all權限已經賦予給public角色即允許任何人在裡面建立對象
shema級别權限
包括允許檢視schema中的對象,允許在schema中建立對象。
預設情況下建立的schema的權限不會賦予給public角色
除了超級使用者和owner,任何人都沒有權限檢視schema中的對象或者在schema中建立對象
賦予權限
GRANT示例:
GRANT ALL ON database dbname TO rolename;
GRANT UPDATE ON tabname TO demo_role;
GRANT SELECT ON ALL TABLES IN SCHEMA schemaname to rolename;
GRANT ALL ON tabname TO rolename;
GRANT ROLE1 TO USER1; (注:角色的屬性不會授予使用者)
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw; #列授權
檢視權限
顯示角色屬性(包含系統權限)
\du 或\du+ [username]
檢視系統表 select * from pg_roles|pg_user;
檢視某使用者或角色的權限
select * from information_schema.table_privileges where grantee='repuser';
顯示對象的通路權限清單
\z或\dp [tablename]
回收權限
REVOKE
文法格式如下:
REVOKE permission_type ON table_name FROM user_name;
其中permission_type和table_name含義與GRANT指令中相同
\h revoke
示例:
REVOKE ALL ON accounts FROM PUBLIC;
其含義為:對所有角色(PUBLIC)撤銷在accounts對象上的所有權限(ALL)
權限實驗
appadmin下app1無法使用appadmin使用者建立的表
set role appadmin;後可以使用了