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 '123456' craterole valid until 'infinity'; create role username3 login password '123456' login 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 命令来实现冒名顶替其父角色的身份,从而得到超级用户权限,但是这种冒名顶替仅在当前会话存储期间有效。
例如:username1是username5的成员角色,其可以通过下列命令实现冒名顶替的目的。
SET ROLE username5
当然这是非永久授权行为,一旦会话结束,超级用户权限将被回收。
然而,命令:SET SESSION AUTHORIZATION username1,更加强大。
两者比较:
(1)首先,只有具备SUPERUSER权限的角色才可以执行SET SESSION AUTHORIZATION,SET ROLE任何一个成员角色都可以执行;
(2)其次,SET SESSION AUTHORIZATION可以使当前角色扮演系统中任何一个其他角色,SET ROLE仅限于扮演父角色。
(3)从系统内部实现机理看,每个会话会有两个表示当前用户身份的环境变量:一个是session_user,即当前用户登录带的原始身份;一个是current_user,即当前用户所扮演的身份,默认二者一致。SET SESSION AUTHORIZATION命令会将session_user和current_user都替换为所扮演角色的相应身份ID,而SET ROLE只会修改current_user,而保持session_user不变。这也意味着SET SESSION AUTHORIZATION命令会对后续的SET ROLE命令产生影响,因为原始身份session_user发生了变化;而SET ROLE不会对后续的SET SESSION AUTHORIZATION产生影响,因为原始身份session_user未发生变化。