網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
角色
PG中使用角色(role)機(jī)制來(lái)解決用戶身份認(rèn)證。擁有登陸數(shù)據(jù)庫(kù)權(quán)限的角色稱之為可登錄角色(login role)。一個(gè)角色可以繼承其他角色的權(quán)限從而成為其成員角色;擁有成員角色的角色稱為組角色。(一個(gè)組角色可以是另一個(gè)組角色的成員角色,并且這種角色之間的繼承關(guān)系可以無(wú)限多層,但除非你非常有把握,否則別這么折騰自己)擁有登錄權(quán)限的組角色稱為可登錄的組角色。然而,基于安全性的考慮,管理員呢一般是不會(huì)給組角色登陸權(quán)限的。一個(gè)角色還可以被授權(quán)于超級(jí)用戶權(quán)限,但是此種授權(quán)要謹(jǐn)慎。
PG在最近的版本已經(jīng)不再使用“用戶”和“組”這兩個(gè)術(shù)語(yǔ),別人可能還會(huì)用,你就記住,用戶代表可登錄角色,組代表組角色就好。當(dāng)然,PG為了保持前向兼容,create user和create group 這兩個(gè)命令在當(dāng)前版本中也是支持的,但與時(shí)俱進(jìn)嘛,最好不要使用他們,請(qǐng)使用create role。
創(chuàng)建可登錄角色
在PG安裝的過(guò)程中的數(shù)據(jù)初始化階段,系統(tǒng)是會(huì)默認(rèn)創(chuàng)建一個(gè)名為postgres的可登錄角色(同時(shí)會(huì)創(chuàng)建一個(gè)名為postgres的同名databases)。你可以通過(guò)前面文章介紹過(guò)的ident或者peer身份驗(yàn)證機(jī)制來(lái)將操作系統(tǒng)的root用戶映射到數(shù)據(jù)庫(kù)的postgres角色,這樣就可以實(shí)現(xiàn)root用戶免密登陸,當(dāng)然或者通過(guò)設(shè)置trust模式的效果也是一樣。數(shù)據(jù)庫(kù)安裝完成的第一件事就是用psql或者pgadmin工具以postgres角色身份登陸,然后創(chuàng)建其他已經(jīng)規(guī)劃好的角色。
?創(chuàng)建具備登陸權(quán)限的角色
CREATE ROLE leo LOGIN PASSWORD 'mimajiushiwo' VALID UNTIL 'infinity' CREATEDB;
VALID子句是可選的,其功能是為此角色的權(quán)限設(shè)定的有效期,如果不寫則該角色永久有效,CREATEDB 子句表明為此角色賦予了創(chuàng)建新數(shù)據(jù)庫(kù)的權(quán)限。
?創(chuàng)建具備超級(jí)用戶權(quán)限的角色
CREATE ROLE regina LOGIN PASSWORD 'queen' VALID UNTIL '2023-2-17 00:00' SUPERUSER;
上面的兩個(gè)例子中我們創(chuàng)建的都是可登錄的角色,如果創(chuàng)建不可登錄的角色,省略掉LOGIN PASSWORD 子句既可。
創(chuàng)建組角色
一般是不應(yīng)該授予組角色登錄權(quán)限,但是你想,也不是不可以。
?以下的SQL創(chuàng)建組角色
CREATE ROLE zujuese INHERIT;
注意這個(gè)關(guān)鍵詞INHERIT的用法。他表示組角色zujuese的任何一個(gè)成員角色都將自動(dòng)繼承其除“超級(jí)用戶權(quán)限”外的所有權(quán)限。如果不寫
INHERIT,默認(rèn)也會(huì)有INHERIT的效果。
如果希望禁止組角色將其權(quán)限授予成員角色,加上NOINHERIT關(guān)鍵字。
?以下語(yǔ)句可以為組角色添加成員角色
GRANT zujuese TO leo;
GRANT zujuese TO regina;
我們之前提到過(guò)SUPERUSER超級(jí)用戶權(quán)限是沒(méi)有辦法被繼承的,然而成員角色卻可以通過(guò)SET ROLE命令來(lái)實(shí)現(xiàn)“冒名頂替”其組角色的身份,從而獲得其父角色所擁有的SUPERUSER權(quán)限,當(dāng)然這種冒名頂替的狀態(tài)是有期限的,僅限于當(dāng)前會(huì)話存續(xù)期間有效。
舉例如下:
我們呢先給zujuese超級(jí)用戶權(quán)限:
ALTER ROLE zujuese SUPERUSER;
上面這個(gè)leo是zujuese的成員角色,也繼承了絕大多數(shù)的權(quán)限,但leo登陸后依然不具備SUPERUSER權(quán)限。但是呢,我們只要執(zhí)行以下語(yǔ)句就可以獲得SUPERUSER權(quán)限:
SET ROLE zujuese;
我在下面才想明白這個(gè)問(wèn)題:這個(gè)口令的意思是,leo扮演了zujuse在這個(gè)角色,雖然leo是zujuese的成員角色,但是superuser這個(gè)權(quán)限是沒(méi)有被通過(guò)默認(rèn)的賦權(quán)方式賦予的,此時(shí)set role一執(zhí)行,就表示leo現(xiàn)在扮演了zujuese,所以才有了superuser權(quán)限
但是這種方式獲得的SUPERUSER權(quán)限僅僅在會(huì)話存續(xù)期間有效。
雖然這個(gè)操作邏輯看起來(lái)好像很傻很呆 ,但是如果你不希望登錄到以superuser身份犯下一些無(wú)法挽回的錯(cuò)誤,那么這個(gè)方法是值得你考慮的。
所有的用戶都可以使用SET ROLE這個(gè)命令,但是還有一個(gè)比它更加強(qiáng)大的命令:SET SESSION AUTHORIZATION ,該命令只允許具備superuser權(quán)限的用戶執(zhí)行。為了便于理解呢,我們先介紹兩個(gè)postgresql中的全局變量:current_user和session_user。執(zhí)行下面的語(yǔ)句,我們就可以看到在這兩個(gè)變量值。
SELECT session_user ,current_user;
首次登陸后,這兩個(gè)值相同。執(zhí)行set role就會(huì)修改current_user的值,要是執(zhí)行SET SESSION AUTHORIZATION 就會(huì)同時(shí)改變current_user和session_user的值。
以下是set role命令的主要特點(diǎn)。
- set role無(wú)須superuser 權(quán)限既可執(zhí)行。
- set role會(huì)修改current_user變量的值,但不會(huì)修改session_user的值。
- 一個(gè)具備superuser權(quán)限的session_user同名角色可以通過(guò)set role設(shè)置為任何用戶。
- 非超級(jí)用戶可以通過(guò)set role 設(shè)置為session_user同名角色或者其所屬的組用戶。
- set role命令可以讓執(zhí)行角色獲取到所“扮演”角色的全部權(quán)限,當(dāng)然除了,set role 和SET SESSION AUTHORIZATION權(quán)限。
SET SESSION AUTHORIZATION是比set role 更為強(qiáng)大的命令,其關(guān)鍵特性如下:
- 只有超級(jí)用戶才可以執(zhí)行SET SESSION AUTHORIZATION
- SET SESSION AUTHORIZATION在整個(gè)會(huì)話存續(xù)期間都是有效的,也就是說(shuō)及時(shí)超級(jí)用戶通過(guò)SET SESSION AUTHORIZATION來(lái)扮演了一個(gè)非超級(jí)用戶,只要會(huì)話未中斷,都可以在上面再次執(zhí)行SET SESSION AUTHORIZATION命令的。
- SET SESSION AUTHORIZATION會(huì)將current_user和session_user修改為要扮演的角色。
- 具備超級(jí)用戶權(quán)限的session_user同名角色可以通過(guò)set role 來(lái)扮演任何其他角色。
下面呢,我們就展示一波:
?
psql -U leo -d postgres
SELECT session_user ,current_user;
?set role zujuese;?
SELECT session_user ,current_user;
alter role leo superuser;
set role regina ;
SELECT session_user ,current_user;
set session authorization regina;
為啥這個(gè)不成功呢,這就是我們上面說(shuō)的set role的特點(diǎn),是有了全部權(quán)限,但是set role和set session authorization權(quán)限是沒(méi)有的。
所以我們退出后,再用leo登陸:
這說(shuō)明什么呢,這說(shuō)明我們上次扮演的時(shí)候給我們賦予的superuser權(quán)限是會(huì)話結(jié)束還是生效的
所以我們這波set session authorization直接就是成功了。
原文鏈接:https://juejin.cn/post/7202174760000045115
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-12-04 WxPython界面利用pubsub如何實(shí)現(xiàn)多線程控制_python
- 2022-05-29 C語(yǔ)言?語(yǔ)義陷阱超詳細(xì)梳理總結(jié)_C 語(yǔ)言
- 2022-07-13 VMware安裝VMware Tools失敗/安裝不了,無(wú)網(wǎng)絡(luò)離線安裝
- 2022-11-19 Python變量和數(shù)據(jù)類型和數(shù)據(jù)類型的轉(zhuǎn)換_python
- 2024-03-02 前端directus對(duì)接單點(diǎn)登錄
- 2022-08-27 Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼_python
- 2023-02-04 python?配置uwsgi?啟動(dòng)Django框架的詳細(xì)教程_python
- 2022-10-30 Android中二維碼的掃描和生成(使用zxing庫(kù))_Android
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支