PostgreSQL的用户、角色和权限管理

2018年05月18日 14:02:29 jerry-89 阅读数 6143
https://blog.csdn.net/eagle89/article/details/80363365

最近公司在用瀚高 需要学习一下. 
 
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eagle89/article/details/80363365

Pg权限分为两部分,一部分是“系统权限”或者数据库用户的属性,可以授予role或user(两者区别在于login权限);一部分为数据库对象上的操作权限。

超级用户不做权限检查,其它走acl。

对于数据库对象,开始只有所有者和超级用户可以做任何操作,其它走acl。在pg里,对acl模型做了简化,组和角色都是role,用户和角色的区别是角色没有login权限。

pg_roles:

该视图提供访问数据库角色有关信息的接口。这个视图只是pg_authid表的公开可读部分的视图化,同时把口令字段用空白填充。

该视图提供访问数据库角色有关信息的接口。这个视图只是pg_authid表的公开可读部分的视图化,同时把口令字段用空白填充。

名字 类型 引用 描述
rolname name   角色名。
rolsuper bool   是否有超级用户权限的角色。
rolcreaterole bool   是否可以创建更多角色的角色。
rolcreatedb bool   是否可以创建数据库的角色。
rolcatupdate bool   是否可以直接更新系统表的角色。
rolcanlogin bool   如果为真,表示是可以登录的角色。
rolpassword text   不是口令(总是 ********)。
rolvaliduntil timestamptz   口令失效日期(只用于口令认证);如果没有失效期,为NULL。
rolconfig text[]   运行时配置变量的会话缺省。

1.CREATE ROLE创建的用户默认不带LOGIN属性,而CREATE USER创建的用户默认带有LOGIN属性,如下:

2.在创建用户时赋予角色属性

postgres=# CREATE  ROLE test_user_3 CREATEDB;  /*具有创建数据库的属性*/  
CREATE ROLE
postgres=# \du
                                    List of roles
  Role name  |                         Attributes                         | Member of 
-------------+------------------------------------------------------------+-----------
 postgres    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test_user_1 | Cannot login                                               | {}
 test_user_2 |                                                            | {}
 test_user_3 | Create DB, Cannot login                                    | {}

postgres=# CREATE ROLE test_user_4 CREATEDB PASSWORD '123456';  /*具有创建数据库及带有密码登陆的属性 */

CREATE ROLE
postgres=# \du
                                    List of roles
  Role name  |                         Attributes                         | Member of 
-------------+------------------------------------------------------------+-----------
 postgres    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test_user_1 | Cannot login                                               | {}
 test_user_2 |                                                            | {}
 test_user_3 | Create DB, Cannot login                                    | {}
 test_user_4 | Create DB, Cannot login                                    | {}

3.给已存在用户赋予各种权限

使用ALTER ROLE即可。

实验:

先创建一个角色,

再创建一个超级用户csm、

普通用户csm_ca,

在csm用户下创建一个数据库testdb,在这个数据库里创建一个schema:csm_ca,然后赋予普通用户csm_ca操作数据库testdb里schema:csm_ca里的表的权限。

1.1.1 实验

1.1.1.1 创建角色与用户

CREATE ROLE 语法

CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option can be:
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

1)  创建david 角色和sandy 用户

CREATE ROLEdavid;  //默认不带LOGIN属性

CREATE USERsandy;  //默认具有LOGIN属性

验证LOGIN属性

连接数据库

psql –h IP  -U david;    //不能登录

psql –h IP  -U sandy;   //能登录

修改david 的权限,增加LOGIN权限
 ALTER ROLE david LOGIN ;

ALTER ROLE davidwith password 'david';

ALTER ROLE sandywith password 'sandy';

再次验证LOGIN属性
 psql -h 127.0.0.1 -U sandy -d postgres

2)  查看角色信息

psql 终端可以用\du 或\du+ 查看,也可以查看系统表 select * from pg_roles;

3)  角色属性(Role Attributes)

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

属性

说明

login

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

superuser

数据库超级用户

createdb

创建数据库权限

createrole

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

replication

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

password

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

inherit

用户组对组员的一个继承标志,成员可以继承用户组的权限特性

...

...

4)   创建用户时赋予角色属性

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

Psql -h ip -U david -d postgres

CREATE DATABASE test;

ERROR: permission denied to create database

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

CREATE ROLE bella CREATEDB ;

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

a.测试renee 角色

psql -h 127.0.0.1 -U renee -d postgres

用renee 用户登录数据库,发现不需要输入密码既可登录,不符合实际情况。

b. 查找原因 
在角色属性中关于password的说明,在登录时要求指定密码时才会起作用,比如md5或者password模式,跟客户端的连接认证方式有关。

查看pg_hba.conf 文件,发现local 的METHOD 为trust,所以不需要输入密码。

将local 的METHOD 更改为password,然后保存重启postgresql。

c. 再次验证

提示输入密码,输入正确密码后进入到数据库。

d. 测试创建数据库

创建成功。

5)  给已存在用户赋予各种权限

使用ALTER ROLE 命令。
ALTER ROLE 语法:
ALTER ROLE name [ [ WITH ] option [ ... ] ]
where option can be:

SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'

ALTER ROLE name RENAME TO new_name

ALTER ROLE name [ IN DATABASE database_name ] SETconfiguration_parameter { TO | = } { value | DEFAULT }
ALTER ROLE name [ IN DATABASE database_name ] SET configuration_parameter FROMCURRENT
ALTER ROLE name [ IN DATABASE database_name ] RESET configuration_parameter
ALTER ROLE name [ IN DATABASE database_name ] RESET ALL
  赋予bella 登录权限
a. 查看现在的角色属性

ALTER ROLE bella WITH LOGIN;

赋予renee 创建角色的权限
postgres=# ALTER ROLE renee WITH CREATEROLE;

赋予david 带密码登录权限
postgres=# ALTER ROLE david WITH PASSWORD 'ufo456';

设置sandy 角色的有效期
postgres=# ALTER ROLE sandy VALID UNTIL '2014-04-24';

postgres=# SELECT * from pg_roles ;

6)  角色赋权/角色成员

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

创建组角色
 CREATE ROLE father login nosuperusernocreatedb nocreaterole noinherit encrypted password 'abc123';

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

\c test renee

create  table emp ( idserial,name text);

INSERT INTO emp (name) VALUES ('david');

INSERT INTO emp (name) VALUES ('sandy');

SELECT * from emp;

test=> GRANT USAGE ON SCHEMA public to father;
WARNING:  no privileges were granted for "public"
GRANT

test=> GRANT SELECT on public.emp to father;
GRANT
test=> 
 创建成员角色
test=> \c postgres postgres
You are now connected to database "postgres" as user"postgres".

postgres=# CREATE ROLE son1 login nosuperuser nocreatedb nocreaterole inheritencrypted password 'abc123';
CREATE ROLE
postgres=# 
这里创建了son1 角色,并开启inherit 属性。PostgreSQL 里的角色赋权是通过角色继承(INHERIT)的方式实现的。
  将father 角色赋给son1
postgres=# GRANT father to son1;
GRANT ROLE
postgres=# 
还有另一种方法,就是在创建用户的时候赋予角色权限。
postgres=# CREATE ROLE son2 login nosuperuser nocreatedb nocreaterole inheritencrypted password 'abc123' in role father;
CREATE ROLE
postgres=# 
  测试son1 角色
postgres=# \c test son1

用renee 角色新创建一张表,再次测试

test=> \c test renee

CREATE TABLE dept (deptid integer,deptname text);

INSERT INTO dept (deptid, deptname) values(1, 'ts');

test=> \c test son1
You are now connected to database "test" as user "son1".
test=> SELECT * from dept ;
ERROR:  permission denied for relation dept
test=> 
son1 角色只能查询emp 表的数据,而不能查询dept 表的数据,测试成功。
 查询角色组信息

test=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# 
postgres=# \du

postgres=# 
“ Member of ” 项表示son1 和son2 角色属于father 角色组。

1.1.1.2 赋予某账号只读权限

创建一个不带有权限的基本用户  pg_client

Create user  client;

\du

登录账号并赋予pg_client查询表的权限,但是在list of rolesattributes 并未出现select信息

\l

./psql -U ctsi_lbs -d ctsi_lbs_db

grantselect  on all tables in schema public to pg_client;

登录pg_client账号,验证权限是否成功

./psql-U  client -d ctsi_lbs_db

\dt

[转帖]PostgreSQL的用户、角色和权限管理的更多相关文章

  1. WordPress用户角色及其权限管理编辑插件:User Role Editor汉化版

    如果Wordpress默认的用户角色及权限不能满足您的需求,又觉得修改代码编辑用户权限太麻烦.那不妨试试User Role Editor,Wordpress用户角色及其权限管理编辑插件. User R ...

  2. SpringSecurity 自定义用户 角色 资源权限控制

    SpringSecurity 自定义用户 角色 资源权限控制 package com.joyen.learning.security; import java.sql.ResultSet; impor ...

  3. 【视频分享】Liger UI实战集智建筑project管理系统配商业代码(打印报表、角色式权限管理)

    QQ 2059055336 课程讲师:集思博智 课程分类:.net 适合人群:中级 课时数量:23课时 用到技术:Liger UI框架.AJAX.JSON数据格式的序列化与反序列化.角色的交叉权限管理 ...

  4. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  5. (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理

    用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...

  6. 10.spring-boot基于角色的权限管理页面实现

    10.spring-boot基于角色的权限管理页面实现

  7. Linux用户及文件权限管理

    Linux用户及文件权限管理

  8. 实验楼学习linux第一章第三节用户及文件权限管理

    用户及文件权限管理 常用命令 查看用户 whoami 创建用户 sudo adduser 用户名 切换账户 su 用户名 删除账户 sudo deluser 用户名 --remove-home 查看用 ...

  9. MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数

    用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...

随机推荐

  1. could not load file or assembly "System.Web.Mvc...

    1.一般出现这个错误是因为Web.Config里面的版本号跟project用到的dll版本对应不上 更改webconfig <add assembly="System.Web.Mvc, ...

  2. LA 6979 Known Notation 构造+贪心 铜牌题

    题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...

  3. 【csp模拟赛1】铁路网络 (network.cpp)

    [题目描述] 在暑假来临之际,小 Z 的地理老师布置了一个暑假作业,让同学们暑假期间 了解一下 C 国的铁路发展史.小 Z 在多番查证资料后发现,C 国在铁路发展初期, 铁路网络有着一个严密规整的结构 ...

  4. [Linux]awk RSTART,RLENGTH

    转自 http://blog.sina.com.cn/s/blog_6d76c7e20102v381.html awk 是一门非常优秀的文本处理工具,甚至可以上升作为一门程序设计语言. 它处理文本的速 ...

  5. 最初学习mysql的一些操作留存

    一:数据库的初始话操作 mysql -u root -p    //数据库的登陆 show databases:    //展现数据哭中存储的所有文件 use 数据库名:        //进入当前要 ...

  6. linux中wget未找到命令

    (转)linux中wget未找到命令   转:https://blog.csdn.net/djj_alice/article/details/80407769 在装数据库的时候发现无法使用wget命令 ...

  7. LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  8. QObject 的拷贝构造和赋值操作

    QOject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承自 ...

  9. 一个简易的PHP读取CSV文件的方法

    1. 思路:先打开文件,读取出文件有多少行,然后逐行读取数据放入一个数组中 public function read_csv_lines($csv_file = '', $lines = 0, $of ...

  10. python设计模式-命令模式

    命令模式就是对命令的封装.所谓封装命令,就是将一系列操作封装到命令类中,并且命令类只需要对外公开一个执行方法execute,调用此命令的对象只需要执行命令的execute方法就可以完成所有的操作.这样 ...