PostgreSQL 角色权限管理

PostgreSQL  角色权限管理

PostgreSQL中使用角色的概念,表示用户账户。拥有登录权限的角色称为可登录角色。一个角色可以继承其他角色的权限,从而成为其成员角色,一个拥有成员角色的角色被称为组角色。

 

PostgreSQL新版本去除了用户的概念,取而待之的是可登录角色组角色。但是为保持前向兼容,create user create group 这两个命令依然支持,但建议最好不要使用。

 

PostgreSQL 安装过程中数据库初始化,系统会默认创建一个postgres的角色,同时会创建一个同名(postgres)的数据库。安装完成后要做的第一件事就是用psql或者pgAdmin工具以postgres角色身份登录,然后创建其他已规划好的角色。

 

  

角色

 

1.创建普通用户角色

create role username1 login password '123456' createdb valid until 'infinity';

create role username2 login password '123456craterole valid until 'infinity';

create role username3 login password '123456login valid until 'infinity;

 

valid 是可选的,其功能是为此角色权限设置有效期,过期后所有权限都将失效,默认为'infinity',即永不过期

createdb修饰符表示为此角色赋予创建新数据库的权限

craterole修饰符表示为此角色赋予创建新角色的权限

login 修饰符表示此角色只有登录权限

 

2.创建超级用户角色

create role username4 login password '123456' superuser valid until '2020-1-1 00:00:00';

 

3.修改角色权限

alter role username4 nologin nocreatedb;

 

 

组角色

 

1.创建组角色

create role username5 inherit;

grant username5 to username1;

grant username5 to username2;

 

Inherit表示username5的任何一个成员角色都将自动继承“超级用户权限”外的所有权限。出于安全考虑,PostgreSQL不允许超级用户权限通过继承的方式传递。

 

2.从组角色继承权限

 

PostgreSQL还有一个奇葩功能是禁止组角色将其权限授予其成员角色,该功能通过NOINHERIT 关键字控制。因此创建组角色时务必显式声明INHERIT或者NOINHERIT关键字。

 

有些权限无法继承,例如前面提到的SUPERUSER超级用户权限。但是其成员角色可以通过SET ROLE 命令来实现冒名顶替其父角色的身份,从而得到超级用户权限,但是这种冒名顶替仅在当前会话存储期间有效。

例如:username1username5的成员角色,其可以通过下列命令实现冒名顶替的目的。

SET ROLE username5

当然这是非永久授权行为,一旦会话结束,超级用户权限将被回收。

 

然而,命令:SET SESSION AUTHORIZATION username1,更加强大。

两者比较:

(1)首先,只有具备SUPERUSER权限的角色才可以执行SET SESSION AUTHORIZATIONSET ROLE任何一个成员角色都可以执行;

(2)其次,SET SESSION AUTHORIZATION可以使当前角色扮演系统中任何一个其他角色,SET ROLE仅限于扮演父角色。

(3)从系统内部实现机理看,每个会话会有两个表示当前用户身份的环境变量:一个是session_user,即当前用户登录带的原始身份;一个是current_user,即当前用户所扮演的身份,默认二者一致。SET SESSION AUTHORIZATION命令会将session_usercurrent_user都替换为所扮演角色的相应身份ID,而SET ROLE只会修改current_user,而保持session_user不变。这也意味着SET SESSION AUTHORIZATION命令会对后续的SET ROLE命令产生影响,因为原始身份session_user发生了变化;而SET ROLE不会对后续的SET SESSION AUTHORIZATION产生影响,因为原始身份session_user未发生变化。

 


 

 
 

 

猜你喜欢

转载自hellolove.iteye.com/blog/2352774