欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 4-用户与角色

4-用户与角色

2024/11/17 9:02:00 来源:https://blog.csdn.net/2401_83604604/article/details/143812799  浏览:    关键词:4-用户与角色

创建用户和角色

创建用户

创建用户语法:

create user name [[with] option [...]]
test=# create user  user02;
CREATE ROLE

option内可以设置系统的权限

参数描述
SUPERUSER | NOSUPERUSER授予(取消)超级用户的权限
CREATE | NOCREATE授予(取消)创建数据库的权限
CREATEROLE | NOCREATEROLE授予(取消)创建角色的权限
LOGIN | NOLOGIN授予(取消)登录数据库的权限
ACCOUNT { LOCK | UNLOCK }锁定或解锁用户
REPLICATION | NORELICATION授予(取消)允许发起流复制或者把系统放入或退出备份模式的权限
INHERIT | NOINHERITi授予(取消)角色成员自动继承父角色拥有的权限
BYPASSRLS | NOBYPASSRLS授予(取消)授权角色是否会忽略表中的行级安全性(RLS)
CONNECTION LIMIT connlimit设置角色能创建的最大并发连接数
参数描述
PASSWORD password设置角色的口令,使用口令认证的角色在没有设置口令时会导致登录失败
VALID UNTIL ‘timestamp’设置角色口令的有效期限,缺省该选项时口令永久有效
IN ROLE role_name列出一个或多个现有的角色,当前创建的新角色作为这些角色的成员加入其中
ROLE role_name列出一个或多个现有的角色,这些角色作为成员加入到当前创建的新角色中
ADMIN role_nameADMIN子句宇ROLE相似,但是体积的角色被使用WITH ADMIN OPTION加入到新角色中,让它们能够把这个角色中的成员关系授予给其他人

创建角色

角色的概念:将一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就称为角色(Role)

可以将角色视作用户组,方便我们批量授权

语法:create role name [option]

test=# create role role01;
CREATE ROLE

修改用户和角色

修改用户

语法:alter user role_specification [option]

设置user02的口令为kingbase

test=# alter role user02 password 'kingbase';
ALTER ROLE

修改角色

语法:alter role role_specification [option]

设置role01的口令为kingbase

test=# alter user role01 password 'kingbase';
ALTER ROLE

删除用户和角色

删除用户

语法:drop user [if exists] name

if exists表示当删除的用户不存在时,并不会报错

删除角色

语法:drop role [if exists] name

无法删除用户的情况

1、对象依赖:当待删除用户是部分对象的拥有者时,因对象依赖会导致删除用户失败;如此时存在一张表test01它的拥有者是user01,如果不删除test01这张表,那么user01是无法直接删除的

2、权限依赖:当待删除用户被显式授予对象权限时,因权限依赖会导致删除用户失败;如在之前的图形化界面中,我们创建并授予了user01这个用户以及一定的权限,此时去删除user01是失败的

test=# drop user user01;  
错误:  无法删除"user01"因为有其它对象倚赖它
描述:  模式 public的权限
数据库 test的权限
表 t01的权限

清楚用户的权限依赖

删除user01在test数据库的所有权限以及在public模式下的所有权限和数据表t01的所有权限

test=# revoke all on DATABASE test from user01;
test=# revoke all on SCHEMA public from user01;				//SCHEMA(schema)就是模式
test=# revike all on TABLE t01 from user01;

用户和角色的区别

角色的概念:将一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就称为角色(Role)

可以将角色视作用户组,方便我们批量授权

但用户和角色最直观的区别就是,使用user登录的时候和使用role登录的时候

可以看出,使用角色登录数据库是不被允许的

[kingbase@node1 ~]$ ksql test user02
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=> \q
[kingbase@node1 ~]$ ksql test role01
ksql: 错误: 无法连接到服务器:致命错误:  不允许角色"role01" 进行登录

其原因是,在创建角色的时候,默认是使用unlogin的方式创建的,而创建用户的时候,默认是使用login的方式去创建的

当我们把role01的修改为login后,再次使用role01登录数据库时,即可登录

test=# alter role role01 login ;
ALTER ROLE
test=# \q
[kingbase@node1 ~]$ ksql test role01
ksql (V8.0)
输入 "help" 来获取帮助信息.

利用"角色"对多个用户批量授权

因为加入到角色的用户会默认继承角色所拥有的权限。再实际的生产环境下,经常使用这个特性对角色进行授权

实验环境准备

1、创建t01表并插入1行数据

test=# CREATE TABLE t01 AS SELECT 100 AS id FROM dual;
SELECT 1

2、创建role01角色

test=# drop role if exists role01;  
注意:  角色 "role01" 不存在
DROP ROLE
test=# create role role01;
CREATE ROLE

3、创建user01用户,使用选项INHERIT(继承,为默认选项);创建user02用户,使用选项NOINHERIT

test=# create user user01 password 'kingbase' inherit;
CREATE ROLE
test=# create user user02 password 'kingbase' noinherit;
CREATE ROLE

4、确认新创建的角色和用户

test=# \du role01|user*角色列表角色名称 |   属性   | 成员属于 
----------+----------+----------role01   | 无法登录 | {}user01   |          | {}user02   | 没有继承 | {}

user01用户和user02用户无权查询t01表

因为在创建用户的时候没有授权,所以当前的user01和user02都是无法查询到t01表的

test=> \conninfo
以用户 "user01" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"
test=> select * from t01
test-> ;
错误:  对表 t01 权限不够
test=> \c test user02
您现在已经连接到数据库 "test",用户 "user02".
test=> select * from t01
test-> ;
错误:  对表 t01 权限不够

使用system用户授权role01角色查询t01表

GRANT的语法:GRANT 权限 to 授权对象;

使用GRANT授权的关键字,使得role01可以对t01进行SELECT

test=# GRANT SELECT on TABLE t01 to role01;
GRANT
test=# \dp t01存取权限架构模式 | 名称 |  类型  |       存取权限        | 列特权 | 策略 
----------+------+--------+-----------------------+--------+------public   | t01  | 数据表 | system=arwdDxt/system+|        | |      |        | role01=r/system       |        | 
(1 行记录)

使用system用户将user01用户和user02加入到role01角色中

test=# GRANT role01 TO user01,user02;
GRANT ROLE
test=# \du user*;角色列表角色名称 |   属性   | 成员属于 
----------+----------+----------user01   |          | {role01}user02   | 没有继承 | {role01}

确认user01有权查询t01表

test=# \c test user01
您现在已经连接到数据库 "test",用户 "user01".
test=> select * from t01
test-> ;id  
-----100
(1 行记录)

确认user02无权查询t01表

test=> select * from t01
test-> ;
错误:  对表 t01 权限不够

特殊功能的用户

1、创建admin用户,使其成为超级管理员

test=# CREATE USER admin SUPERUSER ;                                                                                 
CREATE ROLE
test=# \du admin角色列表角色名称 |   属性   | 成员属于 
----------+----------+----------admin    | 超级用户 | {}

2、创建库级管理员oadba,拥有指定数据库oa中的全部权限

test=# CREATE user oadba ;
CREATE ROLE
test=# create database oa owner oadba;
CREATE DATABASE

3、创建模式级管理员schdba,拥有指定模式schema01中的全部权限

test=# create user schdba ;
test=# create SCHEMA schema01 authorization schdba;
CREATE SCHEMA

4、业务用户

一般授予这类用户对数据有DML和查询权限,通常将该类用户的账号、密码添加到中间件的配置文件中

5、开发者用户

一般授予这类用户具有DDL权限,可以减轻DBA的工作量

6、只读用户

某些场景下仅需授权用户查询权限,防止用户修改数据

两种使用户加入角色的方法

1、使用GRANT [角色名] TO [用户名];将username用户加入到rolename角色内

test=# grant rolename to username ;
GRANT ROLE
test=# \du username 角色列表角色名称 | 属性 |  成员属于  
----------+------+------------username |      | {rolename}

2、使用CREATE [用户名] IN ROLE [角色名]

将username01用户加入到rolename角色内

test=# create user username01 in role rolename; 
CREATE ROLE
test=# \du username01角色列表角色名称  | 属性 |  成员属于  
------------+------+------------username01 |      | {rolename}

创建角色和用户使其等价

我们在前面的学习中知道了,角色和用户的差别最明显的地方就体现到,可以使用用户进行对数据库的登录,而角色不能登录数据库

这是因为,在创建角色时,默认的选项参数就是nologin(无法登录),但若是我们在创建角色时就指定选项login,那么就是和用户是一致的

如下,两个句子是一致的;其中valid until表示账户的有效期

test=# create user user01 connection limit 2 password 'kingbase' valid until '2024-11-11';
test=# create role user01 connection limit 2 password 'kingbase' valid until '2024-11-11' login;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com