pg使用角色的概念管理數據庫訪問權限,角色是一系列相關權限的集合。爲了管理方便,通常把一系列先關的權限賦予給一個角色,如果哪個用戶需要這些權限,就把這些角色賦予給響應的用戶。 由於用戶也擁有一系列的相關權限,爲了簡化管理,在PG中,角色與用戶是沒有區別的,一個用戶也是一個角色,我們可以把一個用戶的權限賦值給另一個用戶。
用戶和角色在整個數據庫實例中是全局的,在同一個實例的不同數據庫中,看到的用戶都是相同的。
數據庫初始化時會創建一個與操作系統同名的超級用戶postgres,也可以使用-U:指定超級用戶
(一)創建用戶和角色
創建用戶和角色的語法如下:
-- 創建用戶
CREATE USER name [[ WITH ] option [...]]
-- 創建角色
CREATE ROLE name [[ WITH ] option [...]]
備註:在PG中,用戶與角色是沒有區別的,角色默認沒有login權限,無法登陸,如果授予login之後,也可以像用戶一樣登陸。
option常用選項如下:
- SUPERUSER | NOSUPERUSER:創建出來的用戶是否爲超級用戶
- CREATEDB | NOCREATEDB:創建出來的用戶是否有create database的權限
- CREATEROLE | NOCREATEROLE:創建出來的用戶是否有創建其它角色的權限
- CREATEUSER | NOCREATEUSER:創建出來的用戶是否有創建其它用戶的權限
- INHERIT | NOINHERIT:確定角色是否繼承其它角色的權限
- LOGIN | NOLOGIN:創建出來的角色是否有登錄權限
- CONNECTION LIMIT n:創建出來的角色併發連接數限制數量,默認值是“-1”,表示沒有限制
- VALID UNTIL 'timestamp':密碼失效時間
(二)權限的管理
在postgresql數據庫中,任何邏輯對象(包括數據庫)都是有所有者的,也就是說數據庫對象都是屬於某個用戶的,所以,無需把對象的權限賦予所有者,因爲所有者默認就擁有所有的權限,在PG數據庫中,刪除及其修改對象的權限都不能賦予別的用戶,它是所有者的固有權限,不能賦予或撤銷,所有者也隱式地擁有把操作該對象的權限授予其他用戶的權利。
(2.1)兩類權限
用戶的權限分兩類,一類是在創建用戶時就指定的權限,有:
- 超級用戶的權限
- 創建數據庫的權限
- 是否允許login的權限
- 更多見
\help create role
這些權限是創建用戶時指定的,後面可以使用alter role來修改。
另一類是有GRANT和REVOKE命令來管理的,有:
-
在數據庫中創建schema的權限
-
在指定的數據庫中創建臨時表的權限
-
連接某個數據庫的權限
-
在某個數據庫中創建數據庫對象的權限,如表、視圖、函數等
-
在一些表中做SELECT 、INSERT、UPDATE、DELETE等操作的權限
-
在一張表的列上做 SELECT 、UPDATE、DELETE等操作的權限
-
對序列進行查詢(執行序列的currval函數)、使用(執行序列的currval和nextval函數)、更新的權限
-
在表上創建觸發器的權限
-
把表、索引創建到指定表空間的權限
(2.2)GRANT 和REVOKE權限
(2.2.1)角色的授予與回收
-- 將角色授予給另外一個角色
GRANT role_name[,...] TO role_name[,...] WITH ADMIN OPTION;
-- 角色回收
REVOKE role_name[,...] FROM role_name[,...][CASCADE | RESTRICT]
(2.2.2)權限的授予與回收
權限的授予
db1=# \help grant
命令: GRANT
描述: 定義存取權限
語法:
-- 表相關權限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] 表名 [, ...]
| ALL TABLES IN SCHEMA 模式名稱 [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 列相關權限
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( 列名稱 [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( 列名稱 [, ...] ) }
ON [ TABLE ] 表名 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 序列相關權限
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE 序列名稱 [, ...]
| ALL SEQUENCES IN SCHEMA 模式名稱 [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 數據庫相關權限
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE 數據庫名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN 域_名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER 外部數據封裝器的名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER 服務器名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 函數、存儲過程相關權限
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } 程序名稱 [ ( [ [ 參數模式 ] [ 參數名稱 ] 參數類型 [, ...
] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA 模式名稱 [, ...] }
(2.2.3)權限授予回收總結
postgresql中的權限是按照以下幾個層次進行管理的:
1.首先管理賦予用戶的特殊權限,如超級用戶的權限,創建數據庫的權限、創建用戶的權限、login權限等
2.然後是在數據庫中創建schema的權限
3.接着是在schema中創建數據庫對象(如表、索引)的權限
4.之後是對錶進行操作(insert、update、delete、select)的權限
5.最後是操作(update、delete、select)表中某些字段的權限
(2.3)權限操作常用命令
(2.3.1)授予增刪查改權限
GRANT update,delete,insert,select ON ALL TABLES IN SCHEMA public TO signalmap_rw;
(2.3.2)回收public權限
在初始化數據庫實例後,數據庫中默認就會存在一個名稱爲“public”的schema,任何用戶都有在public schema上的create 權限,通常我們需要把這個權限回收回來
revoke create on schema public from public;
(2.3.3)創建只讀用戶
-- 回收public模式的create權限
revoke create on schema public from public;
-- 創建只讀用戶,密碼爲readonly
create user readonly password 'readonly';
-- 授權public模式給readonly
grant usage on schema public to readonly;
-- 授權public模式的所有表權限給readonly用戶
grant select on all tables in schema public to readonly;
-- 切換到readonly測試
\c - readonly
-- 切換到postgres用戶
\c - postgres
-- 將public模式的默認表查詢權限授予readonly用戶
alter default privileges in schema public grant select on tables to readonly;
(2.3.4)查看用戶權限
-- 查看某用戶的系統權限
SELECT * FROM pg_roles WHERE rolname='postgres';
-- 查看某用戶的表級別權限
select * from information_schema.table_privileges where grantee='postgres';
-- 查看某用戶的usage權限
select * from information_schema.usage_privileges where grantee='postgres';
-- 查看某用戶在存儲過程函數的執行權限
select * from information_schema.routine_privileges where grantee='postgres';
-- 查看某用戶在某表的列上的權限
select * from information_schema.column_privileges where grantee='postgres';
-- 查看當前用戶能夠訪問的數據類型
select * from information_schema.data_type_privileges ;
-- 查看用戶自定義類型上授予的USAGE權限
select * from information_schema.udt_privileges where grantee='postgres';