轉(zhuǎn)自:https://www.liangzl.com/get-article-detail-124061.html
譯自官方文檔,原文鏈接。對(duì)應(yīng)Keycloak版本為5.0谅辣。
概述
Keycloak支持細(xì)粒度的授權(quán)策略漾橙,并可以對(duì)這些策略進(jìn)一步組合,如:
基于屬性(ABAC)
基于角色(RBAC)
基于用戶(UBAC)
基于上下文(CABC)
基于規(guī)則(Rule-based)
通過JavaScript
使用Jboss Drools
基于時(shí)間(Time-based)
通過SPI自定義訪問控制策略(ACM)
Keycloak提供了一組管理界面和RESTful API燃乍,用于創(chuàng)建權(quán)限唆樊、關(guān)聯(lián)權(quán)限與授權(quán)策略,以及在應(yīng)用程序中執(zhí)行授權(quán)決策刻蟹。
資源服務(wù)器需要依據(jù)一些信息才能判斷權(quán)限逗旁。對(duì)于REST的資源服務(wù)器這些信息通常來自于一個(gè)加密的token,如在每個(gè)訪問請(qǐng)求中攜帶bearer token舆瘪。對(duì)于依賴于session的Web應(yīng)用來說片效,這些信息就來自于每個(gè)request對(duì)應(yīng)的用戶session。
資源服務(wù)器通常執(zhí)行的是基于角色的訪問控制(RBAC)策略英古,即檢查用戶所擁有的角色是否關(guān)聯(lián)了要訪問的資源淀衣。雖然這種方式非常有用,但是它們也有一些限制:
資源和角色緊耦合召调,角色的更改(如添加膨桥、刪除或更改訪問上下文)可能影響多個(gè)資源。
基于RBAC的應(yīng)用程序無法很好地響應(yīng)安全性需求的調(diào)整唠叛。
項(xiàng)目規(guī)模擴(kuò)大時(shí)只嚣,復(fù)雜的角色管理會(huì)很困難而且容易出錯(cuò)。
不夠靈活艺沼。角色并不能有效代表用戶身份册舞,即缺乏上下文信息≌习悖客觀上來說被授予了角色的用戶调鲸,至少會(huì)擁有某些訪問權(quán)限。
當(dāng)下的項(xiàng)目中剩拢,我們需要考慮不同地區(qū)线得、不同本地策略、使用不同設(shè)備徐伐、以及對(duì)信息共享有較高需求的異構(gòu)環(huán)境贯钩。Keycloak授權(quán)服務(wù)可以通過以下方式幫助您提高應(yīng)用程序和服務(wù)的授權(quán)能力:
不同的訪問控制機(jī)制以及細(xì)粒度的授權(quán)策略。
中心化的資源、權(quán)限以及策略管理角雷。
中心化的策略決策祸穷。
REST風(fēng)格的授權(quán)服務(wù)。
授權(quán)工作流以及用戶訪問管理勺三。
可作為快速響應(yīng)您項(xiàng)目中安全需求的基礎(chǔ)設(shè)施雷滚。
架構(gòu)
從設(shè)計(jì)的角度來看,授權(quán)服務(wù)基于一組授權(quán)模式吗坚,提供了以下功能:
策略管理點(diǎn)(PAP)
在Keycloak Admin的基礎(chǔ)上提供了UI界面來管理資源服務(wù)器祈远、資源、范圍商源、權(quán)限以及策略车份。其中的部分功能也可以通過Protection API來實(shí)現(xiàn)。
策略決策點(diǎn)(PDP)
為和權(quán)限請(qǐng)求相應(yīng)的授權(quán)請(qǐng)求以及策略評(píng)估牡彻,提供了分布式的策略決策點(diǎn)扫沼。更多信息請(qǐng)查看獲取權(quán)限章節(jié)。
策略執(zhí)行點(diǎn)(PEP)
為資源服務(wù)器端實(shí)際執(zhí)行授權(quán)決策庄吼,Keycloak提供了用于不同環(huán)境的一些內(nèi)置策略執(zhí)行器缎除。
策略信息點(diǎn)(PIP)
基于Keycloak的認(rèn)證服務(wù)器,可以在策略評(píng)估時(shí)從身份認(rèn)證信息以及上下文環(huán)境中獲取一起其它屬性总寻。
授權(quán)過程
Keycloak的細(xì)粒度授權(quán)主要有三個(gè)必要步驟:
資源管理
權(quán)限及策略管理
執(zhí)行策略
資源管理
資源管理定義了什么是被保護(hù)的對(duì)象器罐。
首先,需要定義被保護(hù)的資源服務(wù)器渐行,通常是一個(gè)web應(yīng)用或一組服務(wù)技矮。有關(guān)資源服務(wù)器的更多信息請(qǐng)參考術(shù)語。
資源服務(wù)器可以使用Keycloak管理員控制臺(tái)來管理殊轴。在那里衰倦,您可以將任何已注冊(cè)的客戶端啟用為資源服務(wù)器,并管理其資源和范圍旁理。
資源可以是web頁面樊零、Rest資源、文件系統(tǒng)上的一個(gè)文件孽文、一個(gè)EJB等等驻襟。它們可以是一組資源(如Java中的一個(gè)Class),也可以是一個(gè)特定的資源芋哭。
舉例來說沉衣,你可以用Bank Account來代表所有的銀行賬戶,并且用它來定義對(duì)全部銀行賬戶的通用授權(quán)减牺。但同時(shí)你也可以為Alice的私有賬戶來單獨(dú)設(shè)置權(quán)限豌习,使得只有Alice本人能夠?qū)ζ滟~戶進(jìn)行某些操作存谎。
資源可以通過Keycloak控制臺(tái)或者Protection API來管理。利用Protection API的方式肥隆,資源服務(wù)器可以遠(yuǎn)程管理資源既荚。
范圍(Scope)通常用來表示在資源上執(zhí)行的動(dòng)作,但是這不是它唯一的用途栋艳。比如你可以使用范圍來代表資源中的一個(gè)或者多個(gè)屬性恰聘。
權(quán)限及策略管理
定義好了資源服務(wù)器和其上的資源,下一步就是定義權(quán)限和策略吸占。
定義策略的步驟圖示如下:
策略定義了在資源或者范圍上執(zhí)行某些動(dòng)作的先決條件晴叨,但是請(qǐng)記住它們并不和被保護(hù)的資源直接綁定。策略是通用的矾屯,可以通過再次組合來構(gòu)造更復(fù)雜的權(quán)限及策略篙螟。
舉例來說,要獲取“User Premium”角色下的資源組訪問權(quán)限问拘,你可以使用RBAC策略。
Keycloak為常用場(chǎng)景提供了一些內(nèi)置的策略類型惧所。你可以使用JavaScript或者JBoss的Drools來編寫自己的策略骤坐。
定義了策略之后就可以來定義權(quán)限了。權(quán)限與被保護(hù)的資源緊耦合下愈,它們由被保護(hù)對(duì)象及策略組合而成纽绍。
執(zhí)行策略
策略的執(zhí)行包含了對(duì)資源服務(wù)器實(shí)際實(shí)施授權(quán)決策的必要步驟。實(shí)現(xiàn)方式是在資源服務(wù)器上啟用策略實(shí)施點(diǎn)(PEP)势似,PEP能夠與授權(quán)服務(wù)器通信拌夏,請(qǐng)求授權(quán)數(shù)據(jù),并根據(jù)服務(wù)器返回的決策來控制對(duì)受保護(hù)資源的訪問履因。
Keycloak提供了一些內(nèi)置的PEP實(shí)現(xiàn)障簿,你可以根據(jù)項(xiàng)目運(yùn)行平臺(tái)來自由選擇。
授權(quán)服務(wù)
授權(quán)服務(wù)包括下列三種REST接口:
Token Endpoint
Resource Management Endpoint
Permission Managerment Endpoint
上邊的各個(gè)endpoint涵蓋了授權(quán)服務(wù)的各個(gè)步驟栅迄。
Token Endpoint
Oauth2客戶端(如前端應(yīng)用)可以通過token endpoint獲取訪問令牌(access token)站故,然后使用這些令牌來獲取資源服務(wù)器(如后端應(yīng)用)上被保護(hù)的資源。同樣毅舆,Keycloak授權(quán)服務(wù)擴(kuò)展了OAuth2西篓,允許基于配置好的策略發(fā)放訪問令牌。這意味著資源服務(wù)器可以利用關(guān)聯(lián)了權(quán)限的令牌來對(duì)資源進(jìn)行保護(hù)憋活。在Keycloak中岂津,帶有權(quán)限的訪問令牌被稱作請(qǐng)求方令牌(Requesting Party Token),或者縮寫為RPT悦即。
更多的信息請(qǐng)查看獲取權(quán)限章節(jié)吮成。
保護(hù)API
保護(hù)API指提供的一系列UMA兼容的操作橱乱,用來幫助資源服務(wù)器管理資源、范圍赁豆、權(quán)限及相關(guān)策略仅醇。只有資源服務(wù)器才能被允許訪問這些API,前提資源服務(wù)器有內(nèi)置的uma_protection范圍魔种。
提供給資源服務(wù)器的API可以分為兩組:
資源管理
創(chuàng)建資源析二、刪除資源、根據(jù)ID查詢节预、其他查詢
權(quán)限管理
發(fā)放權(quán)限Ticket
遠(yuǎn)程資源管理功能默認(rèn)開啟叶摄。可以通過Keycloak管理員控制臺(tái)來關(guān)閉此功能安拟。
如果使用了UMA協(xié)議蛤吓,Protection API對(duì)權(quán)限Ticket的發(fā)放是整個(gè)授權(quán)流程的重要組成部分。后面會(huì)講到糠赦,它們表示著在整個(gè)授權(quán)過程中客戶端所申請(qǐng)的權(quán)限及向服務(wù)器申請(qǐng)包含著權(quán)限的最終令牌会傲。
更多信息請(qǐng)查看保護(hù)API章節(jié)。
名詞解釋
在深入到Keycloak前我們需要解釋一下Keycloak授權(quán)服務(wù)中所用到的專有名詞拙泽。
資源服務(wù)器(Resource Server)
如前所述淌山,資源服務(wù)器通常依賴某種信息來決定是否授權(quán)。該授權(quán)信息通常包含在安全令牌或用戶會(huì)話中顾瞻。
任何可信的Keycloak客戶端都可以作為資源服務(wù)器泼疑。這些客戶端的資源以及范圍由一系列的授權(quán)策略保護(hù)。
資源
資源是應(yīng)用或者組織的資產(chǎn)荷荤。它們可以是一些列的端點(diǎn)退渗、一個(gè)典型的HTML頁面等等。在授權(quán)策略語境中蕴纳,資源指的就是被保護(hù)的對(duì)象会油。
每個(gè)或者每組資源都有著唯一標(biāo)識(shí)。請(qǐng)回想上文的Bank例子古毛。
范圍
資源的范圍擴(kuò)展了資源的訪問界限钞啸。在授權(quán)語義中,范圍是可以應(yīng)用在資源上的許多動(dòng)詞之一喇潘。
它通常表示對(duì)指定資源可施加的動(dòng)作体斩。如查看、編輯颖低、刪除等等絮吵。但是范圍也可以表示資源的其它關(guān)聯(lián)信息。如工程資源和造價(jià)范圍忱屑,這里的造價(jià)范圍被用來定義用戶訪問工程造價(jià)的特定策略及權(quán)限蹬敲。
權(quán)限
權(quán)限將被保護(hù)的對(duì)象與必須評(píng)估的策略關(guān)聯(lián)起來暇昂,以確定是否允許訪問。
X 可以在資源 Z 上施加 Y
這里X指可以是用戶伴嗡、角色急波、用戶組,或者其組合瘪校。在這里你可以使用聲明和上下文澄暮。
Y指代一個(gè)動(dòng)作,如寫阱扬、讀等等泣懊。
Z指代背標(biāo)戶的資源,如 "/accounts"
Keycloak提供了豐富的平臺(tái)用于構(gòu)建從簡單到復(fù)雜的權(quán)限策略麻惶,如基于規(guī)則的權(quán)限控制馍刮。使用Keycloak可以帶來:
減少代碼重構(gòu)和權(quán)限管理成本。
支持靈活的安全模型窃蹋,用以應(yīng)對(duì)安全模型可能的變化卡啰。
支持運(yùn)行時(shí)變化。應(yīng)用系統(tǒng)只需要關(guān)心資源和范圍警没,Keycloak隱藏了它們被保護(hù)的細(xì)節(jié)
策略
策略定義了授予對(duì)象訪問權(quán)時(shí)必須滿足的條件匈辱。與權(quán)限不同,策略不指定受保護(hù)的對(duì)象惠奸,而是指定訪問制定對(duì)象(如資源、范圍或兩者)時(shí)必須滿足的條件恰梢。策略與用來保護(hù)資源的訪問控制機(jī)制(ACMs)密切相關(guān)佛南。使用策略可以實(shí)現(xiàn)基于屬性的訪問控制(ABAC)、基于角色的訪問控制(RBAC)嵌言、基于上下文的訪問控制以及其任何組合嗅回。
Keycloak還提供了聚合策略,即“策略的策略”摧茴。在構(gòu)造復(fù)雜的訪問控制條件時(shí)绵载,Keycloak授權(quán)服務(wù)遵循了分而治之的原則。你可以創(chuàng)建獨(dú)立的策略苛白,并在不同的權(quán)限中使用它們娃豹,然后通過組合它們來構(gòu)造更復(fù)雜的策略。
策略提供者(Policy Provider)
策略提供者是特定策略類型的具體實(shí)現(xiàn)购裙。Keycloak提供的內(nèi)置策略都是由不同的提供者來支持的懂版,也允許添加自定義的策略類型。
Keyclaok提供了SPI(Service Provider Interface)躏率,你可以使用SPI來添加自定義策略提供者躯畴。
權(quán)限許可(Permission Ticket)
權(quán)限許可是由UMA定義的特殊token類型民鼓,它的不透明結(jié)構(gòu)由授權(quán)服務(wù)器所決定。這種結(jié)構(gòu)代表了客戶端請(qǐng)求的資源或者范圍蓬抄、訪問上下文丰嘉,以及要執(zhí)行的策略(RPT)。
在UMA中嚷缭,權(quán)限許可是人與人饮亏、人與組織之間共享的關(guān)鍵。在授權(quán)工作流中使用許可票據(jù)可以支持從簡單到復(fù)雜的一系列場(chǎng)景峭状,讓資源所有者和資源服務(wù)器細(xì)粒度地控制資源訪問克滴。
在UMA工作流中,授權(quán)服務(wù)器向資源服務(wù)器發(fā)出權(quán)限許可优床,資源服務(wù)器將許可返回給試圖訪問受保護(hù)資源的客戶端劝赔。客戶端拿到許可就可以通過將它發(fā)送回授權(quán)服務(wù)器來請(qǐng)求RPT(最終的包含授權(quán)數(shù)據(jù)的令牌)胆敞。
更多授權(quán)許可的信息請(qǐng)查看UMA章節(jié)及UMA規(guī)范着帽。
開始
在使用本教程之前,請(qǐng)確保正確安裝了Keycloak并已經(jīng)初始化了管理員賬戶移层。注意仍翰,你必須在Keycloak同一臺(tái)主機(jī)上運(yùn)行獨(dú)立的WildFly實(shí)例。這個(gè)獨(dú)立的實(shí)例將用來運(yùn)行你的Java Servlet應(yīng)用观话。你可以在啟動(dòng)命令中使用jboss.socket.binding.port-offset來避免端口沖突予借。
可以用如下命令來啟動(dòng)Keycloak服務(wù)(Linux版):
$ .../bin/standalone.sh -Djboss.socket.binding.port-offset=100
Windows版:
> ...\bin\standalone.bat -Djboss.socket.binding.port-offset=100
更多安裝配置WildFly的細(xì)節(jié)請(qǐng)查看這里。
正確安裝啟動(dòng)之后频蛔,可以從http://localhost:8180/auth/dmin?訪問Keycloak控制臺(tái)灵迫,以及從?http://localhost:8080?訪問WildFly實(shí)例。
保護(hù)Servlet應(yīng)用
本入門指南旨在讓您盡快啟動(dòng)晦溪、運(yùn)行及測(cè)試Keycloak提供的各種授權(quán)特性瀑粥。它主要依賴于默認(rèn)的數(shù)據(jù)庫和服務(wù)器配置,并不涉及復(fù)雜的部署選項(xiàng)三圆。有關(guān)特性或配置選項(xiàng)的更多信息狞换,請(qǐng)參閱本文檔中的相關(guān)部分。
本指南闡述了Keycloak授權(quán)服務(wù)的關(guān)鍵概念:
為客戶應(yīng)用提供細(xì)粒度的授權(quán)
將客戶應(yīng)用設(shè)置為資源服務(wù)器并保護(hù)其資源
定義權(quán)限及授權(quán)策略來保護(hù)資源
在應(yīng)用中啟用PEP
創(chuàng)建域(Realm)及用戶
首先來創(chuàng)建域及域中的用戶舟肉。然后在域中創(chuàng)建客戶應(yīng)用修噪,即需要保護(hù)的資源服務(wù)器。
依照以下步驟來創(chuàng)建域及用戶:
1. 創(chuàng)建名為 hello-world-authz 的域路媚。創(chuàng)建成功之后的頁面如下圖:
2. 創(chuàng)建用戶割按。點(diǎn)擊?Users,打開用戶列表頁磷籍。
3. 在右側(cè)空白的用戶列表頁點(diǎn)擊?Add User适荣。
4. 填寫Username现柠、Email、First Name及Last Name弛矛,打開User Enabled選項(xiàng)够吩,然后點(diǎn)擊 Save。
5. 在Credentials選項(xiàng)卡修改用戶密碼丈氓。
6. 填寫New Password周循、及Password Confirmation,然后關(guān)閉Temporary万俗。
7. 點(diǎn)擊Reset Password完成設(shè)置用戶密碼湾笛。
啟用授權(quán)服務(wù)
你可以為已有的客戶端應(yīng)用開啟OpenID Connect協(xié)議。也可以創(chuàng)建一個(gè)新的客戶端闰歪。
依照以下步驟來創(chuàng)建新客戶端:
1. 點(diǎn)擊Clients來創(chuàng)建一個(gè)新的應(yīng)用嚎研,并填寫Client ID,Client Protocol库倘,以及Root URL临扮。
2. 點(diǎn)擊Save。
3. 開啟Authorization Enabled開關(guān)教翩,會(huì)打開新的Authorization選項(xiàng)卡杆勇。
4. 點(diǎn)擊Authorization選項(xiàng)卡:
一旦為客戶端應(yīng)用開啟了授權(quán)服務(wù),Keycloak會(huì)自動(dòng)創(chuàng)建一些授權(quán)默認(rèn)配置饱亿。
有關(guān)授權(quán)配置的更多信息蚜退,請(qǐng)查看開啟服務(wù)授權(quán)章節(jié)。
構(gòu)建彪笼、部署及測(cè)試
到這里钻注,app-authz-vanilla資源服務(wù)器應(yīng)該已經(jīng)被正確配置完畢了,現(xiàn)在我們開始部署杰扫。項(xiàng)目可以在這里直接下載队寇。部署及構(gòu)建的前置要求如下:
Java JDK 8
Apache Maven 3.1.1或更高版本
Git
項(xiàng)目基于最新的Keycloak版本膘掰≌滦眨可以使用如下命令來克隆代碼:
$ git clone https://github.com/keycloak/keycloak-quickstarts
要構(gòu)建的項(xiàng)目地址在:
$ cd keycloak-quickstarts/app-authz-jee-vanilla
獲取適配器配置
構(gòu)建項(xiàng)目之前請(qǐng)依照以下步驟來獲取適配器配置。
1. 點(diǎn)擊Clients识埋。在client列表中凡伊,點(diǎn)擊app-authz-vanilla。
2. 點(diǎn)擊?Installation?選項(xiàng)卡窒舟。在下拉列表中選中Keycloak OIDC JSON格式系忙。然后點(diǎn)擊Download。
3. 將keycloak.json移到app-authz-jee-vanilla/config目錄惠豺。
4. 默認(rèn)情況下银还,訪問無權(quán)限的資源時(shí)Policy執(zhí)行器會(huì)返回403风宁。你也可以定義一個(gè)重定向頁面。要定義重定向頁面需要修改第3步中keycloak.json文件的policy-enforcer配置:
"policy-enforcer": {
? ? "on-deny-redirect-to" : "/app-authz-vanilla/error.jsp"
}
上面的配置將403重定向到一個(gè)錯(cuò)誤頁面蛹疯。
構(gòu)建及部署應(yīng)用
執(zhí)行下面的命令來構(gòu)建戒财、部署應(yīng)用:
$ cd redhat-sso-quickstarts/app-authz-jee-vanilla
$ mvn clean package wildfly:deploy
測(cè)試應(yīng)用
如果成功部署了應(yīng)用,你可以從?http://localhost:800/app-authz-vanilla來訪問Keycloak登錄頁捺弦。
使用剛創(chuàng)建的alice用戶登錄饮寞。
在為客戶端啟用授權(quán)服務(wù)時(shí),Keycloak默認(rèn)提供了一個(gè)簡單的策略列吼,即授予所有該策略保護(hù)的資源以訪問權(quán)限幽崩。
現(xiàn)在你可修改默認(rèn)的權(quán)限及策略,然后來測(cè)試程序的響應(yīng)寞钥,或者使用不同的策略類型來創(chuàng)建新的策略慌申。
可以點(diǎn)擊Authorization選項(xiàng)卡中的Policies選項(xiàng)卡,然后點(diǎn)擊Default Policy來修改:
// The default value is $evaluation.grant(),
// let's see what happens when we change it to $evaluation.deny()
$evaluation.deny();
現(xiàn)在凑耻,退出demo應(yīng)用并重新登錄太示。你會(huì)發(fā)現(xiàn)無法訪問它了:
現(xiàn)在我們不更改默認(rèn)的策略代碼,而是將策略代碼文本區(qū)域下方的Logic更改為Negative香浩。這將重新啟用對(duì)應(yīng)用程序的訪問类缤,默認(rèn)情況下,該策略拒絕所有訪問請(qǐng)求邻吭。同樣餐弱,在測(cè)試此更改之前請(qǐng)記得注銷并重新登錄。
下一步
我們還可以:
創(chuàng)建一個(gè)范圍囱晴,定義一個(gè)策略及它的權(quán)限膏蚓,然后在應(yīng)用端來進(jìn)行測(cè)試』矗看用戶是否能夠執(zhí)行動(dòng)作(或者你剛剛創(chuàng)建的范圍)驮瞧?
創(chuàng)建不同類型的策略湖苞,如基于規(guī)則的屡萤,并將這些策略和默認(rèn)權(quán)限關(guān)聯(lián)起來涡真。
對(duì)默認(rèn)權(quán)限應(yīng)用多個(gè)策略并測(cè)試夕凝。例如杨蛋,組合多個(gè)策略并相應(yīng)地更改決策策略(Decision Strategy)奏寨。
關(guān)于查看及測(cè)試權(quán)限的更多信息椎咧,可以查看獲取授權(quán)上下文章節(jié)凌彬。
授權(quán)快速入門
除了app-authz-jee-vanilla快速開始指南淫痰,Keycloak Quickstarts倉庫中也包含本文檔中的其他例子最楷。
授權(quán)快速開始指南只是一個(gè)起點(diǎn),用于幫助你快速瀏覽在各種場(chǎng)景下keycloak提供的不同技術(shù)以及集成方式。它并不是一個(gè)全面的用戶手冊(cè)籽孙。
每個(gè)快速開始的項(xiàng)目都有一個(gè)README文檔來介紹如何構(gòu)建烈评、部署及測(cè)試。下表是一個(gè)簡單的介紹:
NameDescription
app-authz-jee-servlet介紹在Java EE項(xiàng)目中如何精細(xì)化管理權(quán)限犯建,并基于從Keycloak服務(wù)器獲取到的權(quán)限來動(dòng)態(tài)構(gòu)建菜單
app-authz-jee-vanilla介紹在Java EE項(xiàng)目中如何精細(xì)化管理權(quán)限础倍,并使用默認(rèn)的授權(quán)設(shè)置來保護(hù)資源
app-authz-rest-springboot介紹如何使用Keycloak授權(quán)服務(wù)來保護(hù)SpringBoot項(xiàng)目
app-authz-springboot介紹如何用切面來認(rèn)證并授權(quán)SpringBoot REST服務(wù)
app-authz-uma-photoz這是一個(gè)簡單的基于HTML5+AngularJS+JAX-RS的項(xiàng)目,用來展示如何使用UMA來讓用戶管理自己的權(quán)限
管理資源服務(wù)器
根據(jù)OAuth2規(guī)范胎挎,資源服務(wù)器托管資源沟启,并接受和響應(yīng)對(duì)受保護(hù)資源的請(qǐng)求。
Keycloak為資源服務(wù)器提供了一個(gè)豐富的平臺(tái)犹菇,用于為受保護(hù)的資源啟用細(xì)粒度授權(quán)德迹,并可以根據(jù)不同的訪問控制機(jī)制來決策授權(quán)。
可以為任意客戶端開啟細(xì)粒度授權(quán)揭芍。這樣做的時(shí)候你其實(shí)已經(jīng)將一個(gè)客戶端當(dāng)做了一個(gè)資源服務(wù)器胳搞。
創(chuàng)建客戶端應(yīng)用程序
要開啟Keycloak授權(quán)服務(wù),必須先創(chuàng)建一個(gè)資源服務(wù)器称杨。
1. 點(diǎn)擊Clients
2. 在上面的頁面中點(diǎn)擊?Create肌毅。
3. 輸入Client ID。如my-resource-server姑原。
4. 輸入Root URL悬而。如:
http://${host}:${port}/my-resource-server
5. 點(diǎn)擊?Save。然后開始配置client設(shè)置:
開啟授權(quán)服務(wù)
將Authorization Enabled開關(guān)設(shè)置為ON并保存锭汛,就可以將OIDC 客戶端設(shè)為一個(gè)資源服務(wù)器并開啟細(xì)粒度授權(quán)笨奠。
上面的操作會(huì)打開新的Authorization選項(xiàng)卡:
Authorization選項(xiàng)卡下方會(huì)帶有子選項(xiàng)卡。我們后邊會(huì)講解每個(gè)子選項(xiàng)卡的作用唤殴。先來快速瀏覽一下主要功能:
Settings
包含資源服務(wù)器的常規(guī)設(shè)置般婆。更多細(xì)節(jié)請(qǐng)查看這里。
Resource
在這里可以管理客戶端應(yīng)用的資源朵逝。
Authorization Scopes
在這里管理范圍蔚袍。
Policies
在這里管理策略,以及定義授權(quán)時(shí)必須滿足的條件配名。
Permissions
在這里可以通過將資源/范圍和策略關(guān)聯(lián)起來來設(shè)置它們的權(quán)限啤咽。
Evaluate
在這里模擬授權(quán)場(chǎng)景,并觀察結(jié)果是否和預(yù)期一致段誊。
Export Settings
在這里可以導(dǎo)出授權(quán)配置到JSON文件闰蚕。
資源服務(wù)器設(shè)置
在資源服務(wù)器設(shè)置頁面可以設(shè)置策略執(zhí)行模式栈拖,是否允許遠(yuǎn)程資源管理连舍,并可以導(dǎo)出授權(quán)配置。
策略執(zhí)行模式
強(qiáng)制 默認(rèn)模式,對(duì)沒有關(guān)聯(lián)策略的資源的訪問會(huì)直接被拒絕索赏。
自由 對(duì)沒有關(guān)聯(lián)到策略的資源的訪問會(huì)被允許盼玄。
禁用 禁用所有策略的評(píng)估,并直接允許訪問潜腻。
遠(yuǎn)程資源管理
定義資源是否可被遠(yuǎn)程管理埃儿,如果關(guān)閉,資源僅能在管理員控制臺(tái)管理融涣。
默認(rèn)配置
創(chuàng)建好了資源服務(wù)器童番,Keycloak會(huì)為其自動(dòng)創(chuàng)建默認(rèn)配置。
默認(rèn)配置包括:
一個(gè)默認(rèn)的受保護(hù)資源(通配符)威鹿,它代表著項(xiàng)目中全部資源剃斧。
一個(gè)默認(rèn)策略,始終授予對(duì)受此策略保護(hù)的資源的訪問權(quán)(即默認(rèn)全部授權(quán))忽你。
一個(gè)默認(rèn)權(quán)限幼东,它基于默認(rèn)策略來管理對(duì)所有資源的訪問的權(quán)限。
這個(gè)默認(rèn)的受保護(hù)資源被稱為默認(rèn)資源科雳,導(dǎo)航到Resources選項(xiàng)卡就可以看到它:
這個(gè)資源定義了一個(gè)名為 urn:my-resource-server:resources:default 的類型根蟹,以及一個(gè) /* 的URI。這里的URI以通配符的形式匹配著項(xiàng)目中的全部路徑糟秘。換句話說简逮,當(dāng)為應(yīng)用程序啟用策略強(qiáng)制時(shí),將在授予訪問權(quán)之前檢查與資源關(guān)聯(lián)的所有權(quán)限尿赚。
上面所說的類型可以用來被用來創(chuàng)建基于類型的資源權(quán)限买决,來管理屬于同一類型的資源。
現(xiàn)在可以在Policies選項(xiàng)卡界面查看默認(rèn)的realm策略吼畏。
此策略是一個(gè)基于JavaScript的策略督赤,此策略定義了永遠(yuǎn)無條件授權(quán)。如果點(diǎn)擊了策略你可以看到它定義的規(guī)則如下:
// by default, grants any permission associated with this policy
$evaluation.grant();
最后來看默認(rèn)權(quán)限泻蚊,如果導(dǎo)航到Permissions選項(xiàng)卡躲舌,就可以查看它:
此權(quán)限是一個(gè)基于資源的權(quán)限,定義了一組策略(一個(gè)或多個(gè))應(yīng)用于具有給定類型的所有資源性雄。
修改默認(rèn)配置
可以通過先刪除后新建的方式來修改默認(rèn)配置没卸。
注意默認(rèn)的資源以通配符的形式匹配著所有路徑,在新建時(shí)不要產(chǎn)生沖突秒旋。
默認(rèn)配置定義了一個(gè)映射到應(yīng)用程序中的所有路徑的資源约计。如果要對(duì)自己的資源寫入權(quán)限,請(qǐng)確保刪除默認(rèn)資源或?qū)⑵銾RI字段更改為應(yīng)用程序中更特定的路徑迁筛。否則煤蚌,與默認(rèn)資源關(guān)聯(lián)的策略默認(rèn)情況下總是授予訪問權(quán)。
導(dǎo)出導(dǎo)出授權(quán)配置
資源服務(wù)器的配置可以自由導(dǎo)入導(dǎo)出。當(dāng)你希望為資源服務(wù)器創(chuàng)建初始配置或更新現(xiàn)有配置時(shí)這項(xiàng)功能非常有用尉桩。導(dǎo)出的配置包含:
被保護(hù)的資源和范圍
策略
權(quán)限
導(dǎo)出
遵循以下步驟導(dǎo)出配置:
1. 進(jìn)入Resource Server Settings?頁面筒占。
2. 點(diǎn)擊Export Settings選項(xiàng)卡。
3. 點(diǎn)擊Export按鈕蜘犁。
導(dǎo)出的文件是JSON格式翰苫,導(dǎo)出前會(huì)在text area中展示,你也可以選擇從這里復(fù)制粘貼它这橙。
導(dǎo)入配置文件
依照以下步驟來導(dǎo)入配置文件奏窑。
1. 導(dǎo)航到Resource Server Settings頁面。
通過Select file選擇要導(dǎo)入的配置然后加載屈扎。
管理資源和范圍
資源管理功能相當(dāng)直觀良哲。只要?jiǎng)?chuàng)建了資源服務(wù)器,就可以創(chuàng)建要保護(hù)的資源和范圍助隧≈欤可以從Resource和Scope選項(xiàng)卡來管理它們。
查看資源
在Resouce頁面并村,你可以查看當(dāng)前資源服務(wù)器上的資源列表巍实。
資源列表展示了被保護(hù)的資源的:
類型
URIS
所有者
關(guān)聯(lián)的范圍(如果存在)
關(guān)聯(lián)的權(quán)限
你可以從列表中選擇資源點(diǎn)擊Create Permission來為其創(chuàng)建權(quán)限。
創(chuàng)建權(quán)限前請(qǐng)確保已定義好需要關(guān)聯(lián)的策略哩牍。
創(chuàng)建資源
主要需要考慮的是資源的粒度棚潦。Keycloak的Resource概念可以用來表示一組(一個(gè)或多個(gè))資源,如何定義它們對(duì)于管理權(quán)限非常重要膝昆。
要?jiǎng)?chuàng)建新的資源丸边,請(qǐng)點(diǎn)擊資源列表頁面的右上角Create按鈕。
在Keycloak中荚孵,資源定義了一組通用的信息妹窖,如:
Name
可讀的、全局唯一的字符串
Type
唯一標(biāo)識(shí)一組資源類型的字符串收叶,用來對(duì)不同資源實(shí)例分組骄呼。如自動(dòng)創(chuàng)建的默認(rèn)資源的默認(rèn)類型是 urn:resource-server-name:resources:default
URIS
代表著資源的地址。對(duì)于HTTP資源來說判没,URIS通常是資源的相對(duì)路徑蜓萄。
范圍
資源關(guān)聯(lián)的一個(gè)或多個(gè)范圍。
資源屬性
資源可能具有與其相關(guān)聯(lián)的屬性澄峰。屬性可在評(píng)估權(quán)限時(shí)用于向策略提供附加信息嫉沽。
每個(gè)屬性都是一個(gè)鍵和值對(duì),值可以是字符串集合俏竞。屬性的多個(gè)值可以用逗號(hào)加以區(qū)分绸硕。
分類資源
資源的type字段可用于將不同的資源歸類堂竟,從而可以使用一組公共權(quán)限來保護(hù)它們。
資源所有者
資源都有一個(gè)擁有者臣咖。默認(rèn)情況下資源屬于資源服務(wù)器。
但資源也可以屬于用戶漱牵,從而讓你創(chuàng)建用戶相關(guān)的策略夺蛇。如僅有資源擁有者可以更新或者刪除指定的資源。
資源的遠(yuǎn)程管理
資源遠(yuǎn)程管理接口通過Protection API暴露酣胀。
當(dāng)使用Protection API時(shí)刁赦,可以讓資源服務(wù)器管理來用戶的資源。此時(shí)可以指定用戶ID來將資源設(shè)置為屬于特定用戶闻镶。
Keycloak支持資源服務(wù)器對(duì)其資源的完全控制甚脉。將來Keycloak計(jì)劃允許用戶控制自己的資源,以及批準(zhǔn)授權(quán)請(qǐng)求和管理權(quán)限铆农,特別是使用UMA協(xié)議時(shí)牺氨。
管理策略
如前所屬,策略用來定義授權(quán)前需要滿足的特定條件墩剖。
可以瀏覽Policy選項(xiàng)卡來查看當(dāng)前資源服務(wù)器上的所有策略:
你可以在這里創(chuàng)建及編輯策略猴凹。
要?jiǎng)?chuàng)建新的策略,請(qǐng)從右上角的Create policy下拉列表中選擇一個(gè)策略類型岭皂。接下來我們將詳細(xì)描述每種策略類型郊霎。
基于用戶的策略
基于用戶的策略可以限制只有指定的用戶能夠訪問被保護(hù)的資源。
要?jiǎng)?chuàng)建新的基于用戶的策略爷绘,請(qǐng)?jiān)谛陆ú呗詴r(shí)選中User選項(xiàng)书劝。
配置
名稱
名稱是一個(gè)可讀的字符串。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別土至。
描述
此策略的詳情
Users
指定哪些用戶可以被此策略授權(quán)购对。
邏輯
在評(píng)估了此策略相關(guān)條件之后再應(yīng)用的邏輯。
基于角色的策略
你可以使用這種類型的策略來定義允許一組角色訪問對(duì)象的條件陶因。
默認(rèn)情況下洞斯,如果發(fā)起請(qǐng)求的用戶已被授予此策略中任意一個(gè)角色就可以獲得授權(quán)。也可以根據(jù)需要指定特定的必要角色坑赡,沒有必要角色的用戶將不會(huì)獲得授權(quán)烙如。可以自由組合必需角色和非必需角色毅否,包括領(lǐng)域角色以及客戶端角色亚铁。
要?jiǎng)?chuàng)建基于角色的策略,請(qǐng)?jiān)谛陆ú呗詴r(shí)選中Role螟加。
配置
名稱
名稱是一個(gè)可讀的字符串徘溢。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別吞琐。
描述
此策略的詳情
Realms Roles
指定哪些realm角色被此策略授權(quán)。
Client Roles
指定哪些client角色被此策略授權(quán)然爆。要啟用客戶端角色需要首先選擇一個(gè)Client站粟。
邏輯
在評(píng)估了此策略相關(guān)條件之后再應(yīng)用的邏輯。
定義必要角色
如前所述可以將策略中的角色指定為必要角色曾雕。僅當(dāng)用戶被授予了所有必要角色時(shí)奴烙,才會(huì)被授權(quán)。必要角色可以是realm角色剖张,也可以是client角色切诀。
若要按需指定角色,請(qǐng)選中角色后面的Required復(fù)選框搔弄。
必需的角色的意義在于:你的策略定義了多個(gè)角色幅虑,但只有某個(gè)子集是強(qiáng)制性的。在這種情況下顾犹,你可以通過組合realm和client角色來啟用更細(xì)粒度的RBAC倒庵。例如可以為客戶端訂制特定的策略來要求指定的客戶端角色§潘ⅲ或者僅在特定realm角色存在時(shí)才授予訪問權(quán)限哄芜。你可以在同一個(gè)策略中組合這兩種方法。
基于JavaScript的策略
這種策略允許你編寫JavaScript腳本來定義條件柬唯。它是Keycloak支持的基于規(guī)則的策略類型(rule-based)之一认臊,它基于評(píng)估API幾乎可以提供任意的靈活性。
要?jiǎng)?chuàng)建基于JS的策略锄奢,請(qǐng)?jiān)趧?chuàng)建策略時(shí)選中JavaScript失晴。
配置
名稱
名稱是一個(gè)可讀的字符串。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別拘央。
描述
此策略的詳情
Code
此策略的JavaScript腳本涂屁。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯。
例子
檢查來自評(píng)估上下文的屬性
這是一個(gè)基于JS來實(shí)現(xiàn)基于屬性的權(quán)限控制(ABAC)的例子灰伟,其中的屬性從執(zhí)行上下文環(huán)境中獲炔鹩帧:
var context = $evaluation.getContext();
var contextAttributes = context.getAttributes();
if (contextAttributes.containsValue('kc.client.network.ip_address', '127.0.0.1')) {
? ? $evaluation.grant();
}
檢查請(qǐng)求方身份的屬性
下面基于ABAC的小例子展示了如何檢查申請(qǐng)方的身份:
var context = $evaluation.getContext();
var identity = context.getIdentity();
var attributes = identity.getAttributes();
var email = attributes.getValue('email').asString(0);
if (email.endsWith('@keycloak.org')) {
? ? $evaluation.grant();
}
代碼中所用到的屬性映射自授權(quán)請(qǐng)求攜帶的token中預(yù)先好定義的聲明。
檢查請(qǐng)求方的角色
下面的代碼展示如何檢查用戶是否被授予了keycloak_user的域角色:
var context = $evaluation.getContext();
var identity = context.getIdentity();
if (identity.hasRealmRole('keycloak_user')) {
? ? $evaluation.grant();
}
也可以檢查用戶是否被授予了my-client-role 的客戶端角色栏账,其中my-client是客戶機(jī)應(yīng)用程序的客戶機(jī)id
var context = $evaluation.getContext();
var identity = context.getIdentity();
if (identity.hasClientRole('my-client', 'my-client-role')) {
? ? $evaluation.grant();
}
檢查角色是否授予了一個(gè)用戶
下面的代碼檢查指定的域角色是否授予了一個(gè)用戶:
var realm = $evaluation.getRealm();
if (realm.isUserInRealmRole('marta', 'role-a')) {
? ? $evaluation.grant();
}
下面檢查指定的客戶端角色是否授予了一個(gè)用戶:
var realm = $evaluation.getRealm();
if (realm.isUserInClientRole('marta', 'my-client', 'some-client-role')) {
? ? $evaluation.grant();
}
檢查角色是否授予了一個(gè)組
var realm = $evaluation.getRealm();
if (realm.isGroupInRole('/Group A/Group D', 'role-a')) {
? ? $evaluation.grant();
}
推送任意聲明到服務(wù)器
可以向資源服務(wù)器推送任意聲明帖族,以便提供應(yīng)如何執(zhí)行權(quán)限的附加信息:
var permission = $evaluation.getPermission();
// decide if permission should be granted
if (granted) {
? ? permission.addClaim('claim-a', 'claim-a');
? ? permission.addClaim('claim-a', 'claim-a1');
? ? permission.addClaim('claim-b', 'claim-b');
}
檢查用戶是否屬于某個(gè)組
var realm = $evaluation.getRealm();
if (realm.isUserInGroup('marta', '/Group A/Group B')) {
? ? $evaluation.grant();
}
使用多重訪問控制機(jī)制
你可以自由組合多種訪問控制機(jī)制。下面的例子展示了在同一個(gè)策略中組合RBAC和ABAC挡爵,它將檢查user是否有admin角色竖般,并且其郵箱是否屬于keycloak.org域:
var context = $evaluation.getContext();
var identity = context.getIdentity();
var attributes = identity.getAttributes();
var email = attributes.getValue('email').asString(0);
if (identity.hasRealmRole('admin') || email.endsWith('@keycloak.org')) {
? ? $evaluation.grant();
}
在編寫自己的規(guī)則時(shí),請(qǐng)記住 $evaluate對(duì)象實(shí)現(xiàn)了org.keycloak.authority.policy.evaluate.evaluation茶鹃。有關(guān)該接口的更多信息涣雕,請(qǐng)參見Evaluation?API艰亮。
基于規(guī)則的策略
Drools策略目前僅僅是一個(gè)預(yù)覽版而不是支持的。默認(rèn)情況下該功能被禁用挣郭。
要啟用迄埃,請(qǐng)?jiān)诜?wù)器啟動(dòng)命令中添加?-Dkeycloak.profile=preview?或?-Dkeycloak.profile.feature.authz_drools_policy=enabled。更多細(xì)節(jié)請(qǐng)查看這里兑障。
使用這種類型的策略侄非,你可以使用Drools來定義權(quán)限的條件。Drools可以視作一個(gè)規(guī)則評(píng)估環(huán)境旺垒。它是Keycloak支持的基于規(guī)則的策略類型之一彩库,同樣提供了編寫任何策略的靈活性肤无。
要?jiǎng)?chuàng)建基于規(guī)則的策略先蒋,請(qǐng)?jiān)趧?chuàng)建策略的下拉列表中選擇Rule。
配置
名稱
名稱是一個(gè)可讀的字符串宛渐。我們強(qiáng)烈建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別竞漾。
描述
此策略的詳情。
Policy Maven Artifact
這里需要提供一個(gè)Maven的GAV坐標(biāo)窥翩,然后點(diǎn)擊Resolve來加載Module和Session业岁。
-? Group Id
-? Artifact Id
-? Version
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯。
例子
下面是一個(gè)ABAC的Drools小例子寇蚊,僅當(dāng)申請(qǐng)方為資源擁有者時(shí)才授權(quán)笔时。
import org.keycloak.authorization.policy.evaluation.Evaluation;
rule "Authorize Resource Owner"
? ? dialect "mvel"
? ? when
? ? ? $evaluation : Evaluation(
? ? ? ? ? $identity: context.identity,
? ? ? ? ? $permission: permission,
? ? ? ? ? $permission.resource != null && $permission.resource.owner.equals($identity.id)
? ? ? )
? ? then
? ? ? ? $evaluation.grant();
end
也可以從身份中獲取一個(gè)屬性并加以判斷:
import org.keycloak.authorization.policy.evaluation.Evaluation;
rule "Authorize Using Identity Information"
? ? dialect "mvel"
? ? when
? ? ? $evaluation : Evaluation(
? ? ? ? ? $identity: context.identity,
? ? ? ? ? identity.attributes.containsValue("someAttribute", "you_can_access")
? ? ? )
? ? then
? ? ? ? $evaluation.grant();
end
更多關(guān)于Evaluation接口的信息請(qǐng)查看評(píng)估API。
基于時(shí)間的策略
此種策略允許你制定時(shí)間相關(guān)的權(quán)限條件仗岸。
要?jiǎng)?chuàng)建基于時(shí)間的策略允耿,請(qǐng)?jiān)趧?chuàng)建策略的下拉列表中選中Time。
配置
名稱
名稱是一個(gè)可讀的字符串扒怖。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別较锡。
描述
此策略的詳情
Not Before
在此時(shí)間前不得授權(quán)。只有當(dāng)前日期/時(shí)間晚于或等于此值時(shí)才授權(quán)盗痒。
Not On or After
在此時(shí)間后不得授權(quán)蚂蕴。只有當(dāng)前日期/時(shí)間早于此值時(shí)才授權(quán)。
Day of Month
定義必須授予訪問權(quán)限的日期俯邓。允許指定日期范圍骡楼。此時(shí),只有日期介于或等于指定的兩個(gè)值之間時(shí)稽鞭,才會(huì)授予權(quán)限君编。
Month
定義必須授予訪問權(quán)限的月份。允許指定月范圍川慌。此時(shí)吃嘿,只有當(dāng)月份介于指定的兩個(gè)值之間時(shí)祠乃,才會(huì)授予權(quán)限。
Year
定義必須授予訪問權(quán)限的年份兑燥。允許年份范圍亮瓷。此時(shí),只有當(dāng)前年份位于或等于指定的兩個(gè)值之間時(shí)降瞳,才會(huì)授予權(quán)限嘱支。
Hour
定義必須授予訪問權(quán)限的時(shí)間。允許指定小時(shí)范圍挣饥。此時(shí)除师,只有當(dāng)前時(shí)間介于指定的兩個(gè)值之間時(shí),才授予權(quán)限扔枫。
Minute
定義必須授予訪問的分鐘數(shù)汛聚。允許指定分鐘的范圍。此時(shí)短荐,只有當(dāng)前時(shí)間的分鐘數(shù)介于指定的兩個(gè)值之間倚舀,才會(huì)授予權(quán)限。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯忍宋。
聚合策略
如前所述痕貌,Keycloak支持構(gòu)建策略的策略,稱之為聚合策略糠排。你可以使用策略聚合舵稠,通過重用現(xiàn)有的策略來構(gòu)建更復(fù)雜策略,使得權(quán)限與策略更解耦入宦。
要?jiǎng)?chuàng)建聚合策略哺徊,請(qǐng)?jiān)趧?chuàng)建策略時(shí)選中Aggregated。
假設(shè)有一個(gè)名為_Confidential resource_的資源云石,該資源只能由來自keycloak.org域和特定范圍的IP地址的用戶訪問唉工。你當(dāng)然可以同時(shí)使用這兩種條件創(chuàng)建一個(gè)策略,但你可能希望重用此策略的域部分汹忠,以便用于其它的對(duì)來源網(wǎng)絡(luò)無要求的場(chǎng)景淋硝。
這時(shí)就可以為域和網(wǎng)絡(luò)條件創(chuàng)建單獨(dú)的策略,并基于這兩個(gè)策略的組合創(chuàng)建第三個(gè)策略宽菜。并將新的聚合策略應(yīng)用于任意權(quán)限谣膳。
配置
名稱
名稱是一個(gè)可讀的字符串。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別铅乡。
描述
此策略的詳情
應(yīng)用策略
定義要聚合的一個(gè)或者多個(gè)策略继谚。這里可以選擇已有的策略,也可以創(chuàng)建新策略阵幸。
決策邏輯
此權(quán)限的決策邏輯花履。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯芽世。
決策邏輯
在創(chuàng)建聚合策略時(shí)還可以定義決策邏輯,它將用于根據(jù)各策略的結(jié)果確定最終決策诡壁。
一致通過
默認(rèn)邏輯济瓢。意味著必須滿足全部策略。
肯定的
要求至少一個(gè)策略是積極的妹卿,最終決策才是積極的旺矾。
共識(shí)的
要求正面決策的數(shù)量必須大于負(fù)面決策的數(shù)量。如果正面和負(fù)面的數(shù)量相同夺克,那么最終的決策將是負(fù)面的箕宙。
基于客戶端的策略
可以使用這種類型的策略來定義權(quán)限條件。
要?jiǎng)?chuàng)建基于客戶端的策略铺纽,請(qǐng)?jiān)趧?chuàng)建策略時(shí)選擇Client柬帕。
配置
名稱
名稱是一個(gè)可讀的字符串。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別室囊。
描述
此策略的詳情
客戶端
定義此策略要授權(quán)的客戶端雕崩。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯魁索。
基于組的策略
此種策略允許只有你指定的組才能獲取訪問權(quán)限融撞。
要?jiǎng)?chuàng)建基于組的策略,請(qǐng)?jiān)趧?chuàng)建策略時(shí)選中Group粗蔚。
配置
名稱
名稱是一個(gè)可讀的字符串尝偎。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別。
描述
此策略的詳情
組聲明
在包含組名和/或路徑的令牌中指定聲明(即令牌key/value中的key)鹏控。通常致扯,授權(quán)請(qǐng)求是基于ID Token或Access Token處理的。該策略將根據(jù)Token的組聲明來獲取用戶所屬的組当辐。如果沒有定義抖僵,則從域配置中獲取。
組
在這里選擇在評(píng)估策略時(shí)需要應(yīng)用此策略的組缘揪。添加組之后耍群,可以選中復(fù)選框Extend to Children來將訪問權(quán)擴(kuò)展到子組。如果沒有標(biāo)記找筝,訪問限制只適用于所選的組蹈垢。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯。
擴(kuò)展子組的訪問權(quán)
默認(rèn)情況下袖裕,訪問限制將僅應(yīng)用到配置的組內(nèi)的成員曹抬。
在某些情況下,可能需要對(duì)父子結(jié)構(gòu)的組統(tǒng)一授權(quán)急鳄。此時(shí)你可以選中Extend to Children復(fù)選框谤民。
上面的圖示的策略會(huì)對(duì)IT及其子組的成員統(tǒng)一授予訪問權(quán)限堰酿。
積極邏輯和消極邏輯
策略可以配置為積極或消極。簡單地說张足,可以使用這個(gè)選項(xiàng)來定義策略結(jié)果是應(yīng)該保持原樣胞锰,還是被否定。
舉例來說兢榨,假設(shè)創(chuàng)建了策略嗅榕,其中只有沒有授予特定角色的用戶才被授權(quán)。此時(shí)可以使用該角色創(chuàng)建基于角色的策略吵聪,并將其邏輯字段設(shè)置為消極(Negative)凌那。
策略評(píng)估API
在使用JavaScript或Drools編寫基于規(guī)則的策略時(shí),Keycloak提供了評(píng)估API吟逝,它可以幫忙確定是否應(yīng)該授予權(quán)限帽蝶。
API提供了接口用來讓開發(fā)者訪問一些有用的信息,如:
要評(píng)估的權(quán)限块攒,代表請(qǐng)求的資源和范圍励稳。
與請(qǐng)求資源所關(guān)聯(lián)的屬性
與執(zhí)行上下文相關(guān)的運(yùn)行時(shí)環(huán)境及其屬性
用戶相關(guān)的信息,如組以及角色
主要的接口是?org.keycloak.authorization.policy.evaluation.Evaluation囱井,它的定義如下:
public interface Evaluation {
? ? /**
? ? * Returns the {@link ResourcePermission} to be evaluated.
? ? *
? ? * @return the permission to be evaluated
? ? */
? ? ResourcePermission getPermission();
? ? /**
? ? * Returns the {@link EvaluationContext}. Which provides access to the whole evaluation runtime context.
? ? *
? ? * @return the evaluation context
? ? */
? ? EvaluationContext getContext();
? ? /**
? ? * Returns a {@link Realm} that can be used by policies to query information.
? ? *
? ? * @return a {@link Realm} instance
? ? */
? ? Realm getRealm();
? ? /**
? ? * Grants the requested permission to the caller.
? ? */
? ? void grant();
? ? /**
? ? * Denies the requested permission.
? ? */
? ? void deny();
}
在處理授權(quán)請(qǐng)求時(shí)驹尼,Keycloak會(huì)在評(píng)估任意策略前創(chuàng)建一個(gè)Evaluation實(shí)例。然后將此實(shí)例傳遞給每個(gè)策略庞呕,以確定訪問是授予還是拒絕新翎。
策略通過調(diào)用Evaluation實(shí)例上的 grant() 或 deny() 方法來確定是授權(quán)還是拒絕。默認(rèn)情況下住练,Evaluation實(shí)例的狀態(tài)是拒絕地啰,這意味著策略必須顯式地調(diào)用grant() 方法,以向策略評(píng)估引擎表明應(yīng)該授權(quán)讲逛。
更多Evaluation API相關(guān)信息請(qǐng)查看這里亏吝。
評(píng)估上下文
評(píng)估上下文在評(píng)估的過程中向策略提供有用信息。
public interface EvaluationContext {
? ? /**
? ? * Returns the {@link Identity} that represents an entity (person or non-person) to which the permissions must be granted, or not.
? ? *
? ? * @return the identity to which the permissions must be granted, or not
? ? */
? ? Identity getIdentity();
? ? /**
? ? * Returns all attributes within the current execution and runtime environment.
? ? *
? ? * @return the attributes within the current execution and runtime environment
? ? */
? ? Attributes getAttributes();
}
策略可以從上面的接口中獲日祷臁:
已被認(rèn)證通過的身份
執(zhí)行上下文和運(yùn)行時(shí)環(huán)境的信息
身份信息基于OAuth2 Access Token來創(chuàng)建蔚鸥,創(chuàng)建過程會(huì)從原始Token提取所有聲明。舉例來說括饶,如果你通過Protocal Mapper向OAuth2 Access Token添加了自定義的聲明株茶,你就可以在策略中獲取它并利用它來構(gòu)建你的授權(quán)條件。
EvaluationContext 也提供了訪問執(zhí)行及運(yùn)行時(shí)環(huán)境的入口图焰。但是目前只提供幾個(gè)內(nèi)置屬性:
名稱描述類型
kc.time.date_time當(dāng)前日期和時(shí)間String.Format MM/dd/yyyy hh:mm:ss
kc.client.network.ip_address客戶端的IPv4地址String
kc.client.network.host客戶端主機(jī)名稱String
kc.client.id客戶端IDString
kc.client.user_agentHTTP頭中User-Aggent的值String[]
kc.realm.name域名稱String
管理權(quán)限
權(quán)限關(guān)聯(lián)了被保護(hù)的對(duì)象和要評(píng)估的策略启盛,以決定是否應(yīng)該授予訪問權(quán)。
創(chuàng)建了資源和策略之后,我們現(xiàn)在來管理權(quán)限僵闯。點(diǎn)擊Permissions選項(xiàng)卡:
權(quán)限主要用來管理兩類對(duì)象:
資源
范圍
請(qǐng)?jiān)趧?chuàng)建權(quán)限的下拉列表中選擇想要?jiǎng)?chuàng)建的類型卧抗。下面我們分別講述它們的細(xì)節(jié)。
創(chuàng)建基于資源的權(quán)限
基于資源的權(quán)限定義了一組資源且使用一組策略來保護(hù)這些它們鳖粟。
要?jiǎng)?chuàng)建基于資源的權(quán)限社裆,請(qǐng)?jiān)趧?chuàng)建權(quán)限時(shí)選中?Resource-based:
配置
名稱
名稱是一個(gè)可讀的字符串。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別。
描述
此策略的詳情
此權(quán)限要作用的資源類型
指定是否應(yīng)用于指定類型的資源,如果選擇了這個(gè)屬性就需要填寫資源類型娜睛。
資源類型
定義要保護(hù)的資源類型。Keycloak將對(duì)匹配此類型的所有資源評(píng)估此權(quán)限嗜傅。
資源
此權(quán)限要保護(hù)的一組資源。
策略
定義此權(quán)限關(guān)聯(lián)的一組策略檩赢。這里可以選擇已有的策略或者新建吕嘀。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯。
分類資源的權(quán)限
可以針對(duì)一組同類型的資源統(tǒng)一設(shè)定權(quán)限贞瞒。在對(duì)有著相同訪問限制的資源設(shè)置權(quán)限時(shí)非常有用偶房。
通常可以根據(jù)項(xiàng)目中資源的數(shù)據(jù)或其提供的功能來分類军浆。比如說在一個(gè)金融類的應(yīng)用棕洋,其中每個(gè)銀行賬戶屬于一個(gè)特定的用戶。雖然是不同的銀行賬戶瘾敢,但是可以共享全局銀行機(jī)構(gòu)通用的安全性要求拍冠。你可以使用分類的資源權(quán)限來定義這些通用策略尿这,例如:
僅有賬戶擁有者才能管理自己的賬戶
僅能在賬戶擁有者的國家/地區(qū)進(jìn)行訪問
執(zhí)行特定的身份認(rèn)證方法
要?jiǎng)?chuàng)建分類資源的權(quán)限簇抵,請(qǐng)?jiān)趧?chuàng)建基于資源的權(quán)限時(shí)點(diǎn)擊Apply to Resource Type。Apply to Resource Type開啟后射众,你就可以使用此策略來保護(hù)同一類資源了碟摆。
創(chuàng)建基于范圍的權(quán)限
基于范圍的權(quán)限定義一組范圍,通過關(guān)聯(lián)授權(quán)策略來保護(hù)這些范圍叨橱。與基于資源的權(quán)限不同典蜕,可以使用此權(quán)限類型為與資源關(guān)聯(lián)的范圍創(chuàng)建權(quán)限,從而提供更細(xì)的權(quán)限控制粒度罗洗。
要?jiǎng)?chuàng)建新的基于范圍的權(quán)限愉舔,請(qǐng)?jiān)谛陆?quán)限時(shí)選擇Scoped-based。
配置
名稱
名稱是一個(gè)可讀的字符串伙菜。建議取一些和業(yè)務(wù)相關(guān)的名字以易于識(shí)別轩缤。
描述
此策略的詳情
資源
如果定義了資源,定義的范圍僅與這些資源關(guān)聯(lián)的才有效。如果置空火的,則全部范圍都有效壶愤。
范圍
定義一組要保護(hù)的范圍。
策略
定義此權(quán)限關(guān)聯(lián)的一組策略馏鹤。這里可以選擇已有的策略或者新建征椒。
邏輯
在評(píng)估完此策略相關(guān)條件之后再應(yīng)用的邏輯。
策略決策邏輯
與組合策略一樣湃累,這里可以定義多個(gè)策略評(píng)估結(jié)果如何生效的最終邏輯勃救。
一致通過
默認(rèn)邏輯。意味著必須滿足全部策略治力。
肯定的
要求至少一個(gè)策略是積極的剪芥,最終決策才是積極的。
共識(shí)的
積極策略的數(shù)量必須大于消極策略的數(shù)量琴许,它們的數(shù)量相等時(shí)結(jié)果判定為消極税肪。
評(píng)估以及測(cè)試策略
在設(shè)計(jì)策略時(shí),你可能需要模擬測(cè)試策略的評(píng)估結(jié)果榜田。
可以點(diǎn)擊Evaluate選項(xiàng)卡來使用在線的策略評(píng)估工具益兄。在這里你可以通過輸入模擬請(qǐng)求來查看輸出的評(píng)估結(jié)果。
輸入身份信息
Identify Information過濾器用來選擇發(fā)起請(qǐng)求的用戶箭券。
輸入上下文信息
在Contextual Infomation過濾器添加額外的屬性净捅,Keycloak使用這些屬性來評(píng)估策略。
輸入權(quán)限
Permissions過濾器用來構(gòu)建授權(quán)請(qǐng)求辩块。你可以為一組資源或者范圍來請(qǐng)求權(quán)限蛔六。如果想對(duì)全體資源或范圍進(jìn)行測(cè)試,點(diǎn)擊Add后不要輸入任何信息废亭。
當(dāng)全部配置好之后国章,點(diǎn)擊Evaluate開始評(píng)估。
授權(quán)服務(wù)
Keycloak授權(quán)服務(wù)構(gòu)建在已經(jīng)廣泛使用的標(biāo)準(zhǔn)上豆村,比如OAuth2和UMA規(guī)范液兽。
OAuth2客戶端(如前端應(yīng)用程序)可以利用token endpoint從服務(wù)器獲取Access Token,然后使用Access Token從資源服務(wù)器(例如后端服務(wù))獲取被保護(hù)的資源掌动。Keycloak授權(quán)服務(wù)擴(kuò)展了OAuth2四啰,通過評(píng)估與被請(qǐng)求的資源或范圍相關(guān)聯(lián)的策略來發(fā)出Access Token。這意味著資源服務(wù)器可以基于含有權(quán)限Access Token來控制對(duì)資源的訪問粗恢。在Keycloak授權(quán)服務(wù)中柑晒,這種具有權(quán)限的Access Token稱為請(qǐng)求方令牌或簡稱RPT。
除了發(fā)布RPTs之外眷射,Keycloak授權(quán)服務(wù)還提供了一組RESTful端點(diǎn)匙赞,這些端點(diǎn)允許資源服務(wù)器管理它們受保護(hù)的資源恋追、范圍、權(quán)限和策略罚屋,幫助開發(fā)人員將這些功能集成到應(yīng)用程序中苦囱,以支持細(xì)粒度授權(quán)。