[转帖]PostgreSQL的用户、角色和权限管理
PostgreSQL的用户、角色和权限管理
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的用户、角色和权限管理的更多相关文章
- WordPress用户角色及其权限管理编辑插件:User Role Editor汉化版
如果Wordpress默认的用户角色及权限不能满足您的需求,又觉得修改代码编辑用户权限太麻烦.那不妨试试User Role Editor,Wordpress用户角色及其权限管理编辑插件. User R ...
- SpringSecurity 自定义用户 角色 资源权限控制
SpringSecurity 自定义用户 角色 资源权限控制 package com.joyen.learning.security; import java.sql.ResultSet; impor ...
- 【视频分享】Liger UI实战集智建筑project管理系统配商业代码(打印报表、角色式权限管理)
QQ 2059055336 课程讲师:集思博智 课程分类:.net 适合人群:中级 课时数量:23课时 用到技术:Liger UI框架.AJAX.JSON数据格式的序列化与反序列化.角色的交叉权限管理 ...
- devops-jenkins基于角色的权限管理RBAC
一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理 1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理
用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...
- 10.spring-boot基于角色的权限管理页面实现
10.spring-boot基于角色的权限管理页面实现
- Linux用户及文件权限管理
Linux用户及文件权限管理
- 实验楼学习linux第一章第三节用户及文件权限管理
用户及文件权限管理 常用命令 查看用户 whoami 创建用户 sudo adduser 用户名 切换账户 su 用户名 删除账户 sudo deluser 用户名 --remove-home 查看用 ...
- MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数
用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...
随机推荐
- PHP mysqli_fetch_array() 函数
从结果集中取得一行作为数字数组或关联数组: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("local ...
- PHP mysqli_get_client_stats() 函数
定义和用法 mysqli_get_client_stats() 函数返回有关客户端每个进程的统计. 语法 mysqli_get_client_stats(); 返回有关客户端每个进程的统计: < ...
- BZOJ 4562: [Haoi2016]食物链 拓扑排序
建反图,跑一个拓扑排序dp即可. Code: #include <bits/stdc++.h> #define ll long long #define N 100005 #define ...
- [Luogu] 无线网络发射器选址
https://www.luogu.org/problemnew/show/P2038 二维前缀和 #include <iostream> #include <cstdio> ...
- ImageSharp跨平台图片处理
添加nuget引用 SixLabors.ImageSharp 和SixLabors.ImageSharp.Drawing 暂时只实现了缩略图..<pre>using SixLabors.I ...
- 浏览器事件循环机制(event loop)
JS是单线程的 JS是单线程的,或者说只有一个主线程,也就是它一次只能执行一段代码.JS中其实是没有线程概念的,所谓的单线程也只是相对于多线程而言.JS的设计初衷就没有考虑这些,针对JS这种不具备并行 ...
- 1.2 JAVA的String类和StringBuffer类
一.String 1.String概念 String不属于基本类型,String是final修饰的是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了如果要对String修改使用 ...
- 安装conda后取消命令行前出现的base,取消每次启动自动激活conda的基础环境, 使用ubuntu 自带的Python环境
方法一: 退出base环境回到系统自带的环境 conda deactivate 方法二 1,通过将auto_activate_base参数设置为false实现: conda config --set ...
- svn上误删除覆盖的文件简单恢复步骤
因为失误,不小心把同事提交到svn的文件给覆盖删除了.早上来和我说,吓死宝宝了... 还好,svn是个好东西,恢复到某个版本就行了.下面是简单步骤: 1.在本地的svn项目文件,右键---Toitoi ...
- php反序列化笔记
普通的魔法方法 public,private,protected属性序列化后的不同 绕过wakeup session反序列化 phar反序列化 1.普通的魔法方法 __construct() 创建一个 ...