PostgreSQL权限控制

postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}

创建一个test1的用户,他可以创建数据库但是无法登陆

postgres=# create role test1 createdb;
CREATE ROLE
postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB, 无法登录                          | {}

创建一个test2的用户密码是123456,也是无法登陆的

postgres=# create role test2 createdb password '123456';
CREATE ROLE
postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB, 无法登录                          | {}
 test2    | 建立 DB, 无法登录                          | {}


赋值给已经存在的用户test1给登陆权限

postgres=# alter role test1 with login;
ALTER ROLE
postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB                                    | {}
 test2    | 建立 DB, 无法登录                          | {}

将建立角色的权限赋值给test2

postgres=# alter role test2 with createrole;
 ALTER ROLE
 postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB                                    | {}
 test2    | 建立角色, 建立 DB, 无法登录                | {}

给角色修改密码:

postgres=# ALTER ROLE test2 WITH PASSWORD '654321';/*修改密码*/  
postgres=# ALTER ROLE test2 WITH PASSWORD '654321';
ALTER ROLE
postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB                                    | {}
 test2    | 建立角色, 建立 DB, 无法登录                | {}

设置角色的有效期:

postgres=# ALTER ROLE test2 VALID UNTIL 'JUL 7 14:00:00 2012 +8';
ALTER ROLE
postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB                                    | {}
 test2    | 建立角色, 建立 DB, 无法登录               +| {}
          | 密码有效直至2012-07-07 14:00:00+08         | 

创建角色与用户

创建test3 角色和tste4 用户
CREATE ROLE test3;  //默认不带LOGIN属性
CREATE USER test4;  //默认具有LOGIN属性

postgres=# create role tets3;
ALTER ROLE tets3 with password '123456';
CREATE ROLE
postgres=# create user tets4;
ALTER ROLE tets4 with password '123456';
CREATE ROLE

postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于 
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 test1    | 建立 DB                                    | {}
 test2    | 建立角色, 建立 DB, 无法登录               +| {}
          | 密码有效直至2012-07-07 14:00:00+08         | 
 tets3    | 无法登录                                   | {}
 tets4    |                                            | {}

验证LOGIN属性

 连接数据库
 

psql –h IP  -U tets3;    //不能登录
  ===
  root@debian:~# psql -h 127.0.0.1 -U tets3
  用户 tets3 的口令:
  psql: 致命错误:  不允许角色"tets3" 进行登录
  ===
  psql –h IP  -U tests;   //能登录
  ===
  root@debian:~# psql -h 127.0.0.1 -U tets4
  用户 tets4 的口令:
  psql: 致命错误:  数据库 "tets4" 不存在
  ===

  如果这样的话是可以登陆的
  root@debian:~# psql -h 127.0.0.1 -U tets4 -d postgres

  登陆tets3就不可用登陆
  root@debian:~# psql -h 127.0.0.1 -U tets3 -d postgres
  用户 tets3 的口令:
  psql: 致命错误:  不允许角色"tets3" 进行登录

修改test3 的权限,增加LOGIN权限

ALTER ROLE tets3 LOGIN ;
   ===
   postgres=# ALTER ROLE tets3 LOGIN;
   ALTER ROLE
   ===
   再次尝试就可以了
   root@debian:~# psql -h 127.0.0.1 -U tets3 -d postgres
   用户 tets3 的口令:
   psql (9.6.13)
   SSL 连接(协议:TLSv1.2,密码:ECDHE-RSA-AES256-GCM-SHA384,密钥位:256,压缩:关闭)
   输入 "help" 来获取帮助信息.

   ===
角色属性(Role Attributes)

	一个数据库角色可以有一系列属性,这些属性定义了他的权限。

	属性

	说明

	login

	只有具有 LOGIN 属性的角色可以用做数据库连接的初始角色名。

	superuser

	数据库超级用户

	createdb

	创建数据库权限

	createrole      

	允许其创建或删除其他普通的用户角色(超级用户除外)

	replication

	做流复制的时候用到的一个用户属性,一般单独设定。

	password

	在登录时要求指定密码时才会起作用,比如md5或者password模式,跟客户端的连接认证方式有关

	inherit
	===

创建用户时赋予角色属性

从pg_roles表里查看到的信息,在上面创建的tets3用户时,默认没有创建数据库等权限。

	psql -h 127.0.0.1 -U tets3 -d postgres

	CREATE DATABASE tets3;

	ERROR: permission denied to create database  没有权限创建数据库

	如果要在创建角色时就赋予角色一些属性,可以使用下面的方法。 
	首先切换到postgres 用户。 
	创建角色test5 并赋予其CREATEDB 的权限。

	CREATE ROLE test5 CREATEDB;

	创建角色test5 并赋予其创建数据库及带有密码登录的属性。 
	postgres=# CREATE ROLE test5 CREATEDB PASSWORD 'abc123' LOGIN;

	====
	postgres=# create role test6 createdb password '123456' login;
	开始验证:
	root@debian:~# psql -h 127.0.0.1 -U test6 -d postgres
	用户 test6 的口令:
	psql (9.6.13)
	SSL 连接(协议:TLSv1.2,密码:ECDHE-RSA-AES256-GCM-SHA384,密钥位:256,压缩:关闭)
	输入 "help" 来获取帮助信息.
	postgres=> create database db1;
	CREATE DATABASE
	===

角色赋权
	在系统的角色管理中,通常会把多个角色赋予一个组,这样在设置权限时只需给该组设置即可,撤销权限时也是从该组撤销。在PostgreSQL中,首先需要创建一个代表组的角色,之后再将该角色的membership 权限赋给独立的角色即可。

	创建组角色
 	CREATE ROLE father login nosuperuser nocreatedb nocreaterole noinherit encrypted password '123456';

	给father 角色赋予数据库test 连接权限和相关表的查询权限。
	GRANT CONNECT ON DATABASE test to father;

 

PostgreSQL创建只读用户,带步骤和删除

现有数据postgres,db2,当前用户为root,schema为public,范例为创建对test2库public下所有表只有查询权限的readonly用户
一.创建
    1. 创建只读用户:

CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly';

2. 设置默认事务只读:

alter user readonly set default_transaction_read_only=on;

3. 赋予用户连接数据库db2的权限:
 

GRANT CONNECT ON DATABASE db2 to readonly;

4. 切换到指定库db2:

\c db2

5. 赋予用户表、序列查看权限,进入指定db运行:
    5.1. 把当前库现有的所有在public这个schema下的表的使用权限赋给用户readonly

GRANT USAGE ON SCHEMA public to readonly;

5.2. 默认把当前库之后新建在public这个schema下的表的使用权限赋给readonly

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

5.3. 赋予用户readonly所有public下的序列的查看权

GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;

5.4. 赋予用户readonly所有public下的表的select权

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

二.删除
    将刚才赋予的权限一一回收

1. 回收schema的usage权限

revoke USAGE ON SCHEMA public from readonly;

2. 回收public下所有表的查询权限:

revoke SELECT ON ALL TABLES IN SCHEMA public from readonly;

3. 回收public下所有序列的查询权限

revoke SELECT ON ALL SEQUENCES IN SCHEMA public from readonly;

4. 回收默认权限

ALTER DEFAULT PRIVILEGES IN SCHEMA public revoke SELECT ON TABLES from readonly;

5. 关闭数据库连接权限

revoke CONNECT ON DATABASE foo from readonly;
6. 关闭默认只读事务设置
	alter user readonly set default_transaction_read_only=off;
	7. 查看权限是否为空了
	\ddp
	8. 通过管理员删除readonly用户:
	drop user readonly;
参考:
https://blog.csdn.net/qq_37568918/article/details/85339277
https://blog.csdn.net/qq_37568918/article/details/85339906
https://blog.csdn.net/eagle89/article/details/80363365
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值