背景
最近在学习PostgreSQL,看了用户权限管理文档,涉及到的知识点比较多,顺便写篇文章进行整理并不定时更新,也方便自己后续进行查阅。
说明
注意:创建好用户(角色)之后需要连接的话,还需要修改2个权限控制的配置文件(pg_hba.conf、pg_ident.conf)。并且创建用户(user)和创建角色(role)一样,唯一的区别是用户默认可以登录,而创建的角色默认不能登录。创建用户和角色的各个参//代码效果参考:http://www.zidongmutanji.com/zsjx/545199.html
数选项是一样的。Tip:安装PostgreSQL会自动创建一个postgres用户,需要切换到该用户下访问PostgreSQL。
创建用户/角色
CREATE USER/ROLE name 【 【 WITH 】 option 【 ... 】 】 : 关键词 USER,ROLE; name 用户或角色名;
where option can be:
SUPERUSER | NOSUPERUSER :超级权限,拥有所有权限,默认nosuperuser。
| CREATEDB | NOCREATEDB :建库权限,默认nocreatedb。
| CREATEROLE | NOCREATEROLE :建角色权限,拥有创建、修改、删除角色,默认nocreaterole。
| INHERIT | NOINHERIT :继承权限,可以把除superuser权限继承给其他用户/角色,默认inherit。
| LOGIN | NOLOGIN :登录权限,作为连接的用户,默认nologin,除非是create user(默认登录)。
| REPLICATION | NOREPLICATION :复制权限,用于物理或则逻辑复制(复制和删除slots),默认是noreplication。
| BYPASSRLS | NOBYPASSRLS :安全策略RLS权限,默认nobypassrls。
| CONNECTION LIMIT connlimit :限制用户并发数,默认-1,不限制。正常连接会受限制,后台连接和prepared事务不受限制。
| 【 ENCRYPTED 】 PASSWORD 'password' | PASSWORD NULL :设置密码,密码仅用于有login属性的用户,不使用密码身份验证,则可以省略此选项。可以选择将空密码显式写为PASSWORD NULL。
//代码效果参考:http://www.zidongmutanji.com/zsjx/155367.html
加密方法由配置参数password_encryption确定,密码始终以加密方式存储在系统目录中。| VALID UNTIL 'timestamp' :密码有效期时间,不设置则用不失效。
| IN ROLE role_name 【, ...】 :新角色将立即添加为新成员。
| IN GROUP role_name 【, ...】 :同上
| ROLE role_name 【, ...】 :ROLE子句列出一个或多个现有角色,这些角色自动添加为新角色的成员。 (这实际上使新角色成为“组”)。
| ADMIN role_name 【, ...】 :与ROLE类似,但命名角色将添加到新角色WITH ADMIN OPTION,使他们有权将此角色的成员资格授予其他人。
| USER role_name 【, ...】 :同上
| SYSID uid :被忽略,但是为向后兼容性而存在。
示例:
创建不需要密码登陆的用户zjy:
postgres=# CREATE ROLE zjy LOGIN;
CREATE ROLE
创建该用户后,还不能直接登录。需要修改 pg_hba.conf 文件(后面会对该文件进行说明),加入:
①:本地登陆:local all all trust
②:远程登陆:host all all 192.168.163.132/32 trust
创建需要密码登陆的用户zjy1:
postgres=# CREATE USER zjy1 WITH PASSWORD 'zjy1';
CREATE ROLE
和ROLE的区别是:USER带LOGIN属性。也需要修改 pg_hba.conf 文件(后面会对该文件进行说明),加入:
host all all 192.168.163.132/32 md5
创建有时间限制的用户zjy2:
postgres=# CREATE ROLE zjy2 WITH LOGIN PASSWORD 'zjy2' VALID UNTIL '2019-05-30';
CREATE ROLE
和2的处理方法一样,修改 pg_hba.conf 文件,该用户会的密码在给定的时间之后过期不可用。
创建有创建数据库和管理角色权限的用户admin:
postgres=# CREATE ROLE admin WITH CREATEDB CREATEROLE;
CREATE ROLE
注意:拥有创建数据库,角色的用户,也可以删除和修改这些对象。
创建具有超级权限的用户:admin
postgres=# CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD 'admin';
CREATE ROLE
创建复制账号:repl
postgres=# CREATE USER repl REPLICATION LOGIN ENCRYPTED PASSWORD 'repl';
CREATE ROLE
其他说明
创建复制用户
CREATE USER abc REPLICATION LOGIN ENCRYPTED PASSWORD '';
CREATE USER abc REPLICATION LOGIN ENCRYPTED PASSWORD 'abc';
ALTER USER work WITH ENCRYPTED password '';
创建scheme 角色
CREATE ROLE abc;
CREATE DATABASE abc WITH OWNER abc ENCODING UTF8 TEMPLATE template0;
\c abc
创建schema
CREATE SCHEMA abc;
ALTER SCHEMA abc OWNER to abc;
revoke create on schema public from public;
创建用户
create user abc with ENCRYPTED password '';
GRANT abc to abc;
ALTER ROLE abc WITH abc;
##创建读写账号
CREATE ROLE abc_rw;
CREATE ROLE abc_rr;
##赋予访问数据库权限,schema权限
grant connect ON DATABASE abc to abc_rw;
GRANT USAGE ON SCHEMA abc TO abc_rw;
##赋予读写权限
grant select,insert,update,delete ON ALL TABLES IN SCHEMA abc to abc;
赋予序列权限
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA abc to abc;
赋予默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA abc GRANT select,insert,update,delete ON TABLES TO abc;
赋予序列权限
ALTER DEFAULT PRIVILEGES IN SCHEMA abc GRANT ALL PRIVILEGES ON SEQUENCES TO abc;
#用户对db要有连接权限
grant connect ON DATABASE abc to abc;
#用户要对schema usage 权限,不然要select * from schema_name.table ,不能用搜索路径
GRANT USAGE ON SCHEMA abc TO abc;
grant select ON ALL TABLES IN SCHEMA abc to abc;
ALTER DEFAULT PRIVILEGES IN SCHEMA abc GRANT select ON TABLES TO abc;
create user abc_w with ENCRYPTED password '';
create user abc_r with ENCRYPTED password '';
GRANT abc_rw to abc_w;
GRANT abc_rr to abc_r;
View Code
授权,定义访问权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
【, ...】 | ALL 【 PRIVILEGES 】 }
ON { 【 TABLE 】 table_name 【, ...】
| ALL TABLES IN SCHEMA schema_name 【, ...】 }
TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##单表授权:授权zjy账号可以访问schema为zjy的zjy表
grant select,insert,update,delete on zjy.zjy to zjy;
##所有表授权:
grant select,insert,update,delete on all tables in schema zjy to zjy;
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name 【, ...】 )
【, ...】 | ALL 【 PRIVILEGES 】 ( column_name 【, ...】 ) }
ON 【 TABLE 】 table_name 【, ...】
TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##列授权,授权指定列(zjy schema下的zjy表的name列)的更新权限给zjy用户
grant update (name) on zjy.zjy to zjy;
##指定列授不同权限,zjy schema下的zjy表,查看更新name、age字段,插入name字段
grant select (name,age),update (name,age),insert(name) on zjy.xxx to zjy;
GRANT { { USAGE | SELECT | UPDATE }
【, ...】 | ALL 【 PRIVILEGES 】 }
ON { SEQUENCE sequence_name 【, ...】
| ALL SEQUENCES IN SCHEMA schema_name 【, ...】 }
TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##序列(自增键)属性授权,指定zjy schema下的seq_id_seq 给zjy用户
grant select,update on sequence zjy.seq_id_seq to zjy;
##序列(自增键)属性授权,给用户zjy授权zjy schema下的所有序列
grant select,update on all sequences in schema zjy to zjy;
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } 【, ...】 | ALL 【 PRIVILEGES 】 }
ON DATABASE database_name 【, ...】
TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##连接数据库权限,授权cc用户连接数据库zjy
grant connect on database zjy to cc;
GRANT { USAGE | ALL 【 PRIVILEGES 】 }
ON DOMAIN domain_name 【, ...//代码效果参考:http://www.zidongmutanji.com/zsjx/132897.html
】TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##
GRANT { USAGE | ALL 【 PRIVILEGES 】 }
ON FOREIGN DATA WRAPPER fdw_name 【, ...】
TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##
GRANT { USAGE | ALL 【 PRIVILEGES 】 }
ON FOREIGN SERVER server_name 【, ...】
TO role_specification 【, ...】 【 WITH GRANT OPTION 】
##
GRANT { EXECUTE | ALL 【 PRIVILEGES 】 }
ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name 【 ( 【 【 argmode 】 【 arg_name 】 arg_type 【, ...】 】 ) 】 【, ...】
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name 【, ...】 }
TO role_specification 【, ...】 【 WITH GRANT OPTION <span style="color: rgba(255, 0