创建用户和角色
创建用户
创建用户语法:
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 | NOINHERIT | i授予(取消)角色成员自动继承父角色拥有的权限 |
BYPASSRLS | NOBYPASSRLS | 授予(取消)授权角色是否会忽略表中的行级安全性(RLS) |
CONNECTION LIMIT connlimit | 设置角色能创建的最大并发连接数 |
参数 | 描述 |
---|---|
PASSWORD password | 设置角色的口令,使用口令认证的角色在没有设置口令时会导致登录失败 |
VALID UNTIL ‘timestamp’ | 设置角色口令的有效期限,缺省该选项时口令永久有效 |
IN ROLE role_name | 列出一个或多个现有的角色,当前创建的新角色作为这些角色的成员加入其中 |
ROLE role_name | 列出一个或多个现有的角色,这些角色作为成员加入到当前创建的新角色中 |
ADMIN role_name | ADMIN子句宇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;