轉(zhuǎn):Keycloak授權(quán)服務(wù)指南(上)

轉(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 IDClient 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ù)的資源和范圍助隧≈欤可以從ResourceScope選項(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來加載ModuleSession业岁。

-? 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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脾猛,一起剝皮案震驚了整個(gè)濱河市撕彤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猛拴,老刑警劉巖羹铅,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異愉昆,居然都是意外死亡职员,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門跛溉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焊切,“玉大人,你說我怎么就攤上這事芳室∽ǚ荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵堪侯,是天一觀的道長嚎尤。 經(jīng)常有香客問我,道長伍宦,這世上最難降的妖魔是什么芽死? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮次洼,結(jié)果婚禮上关贵,老公的妹妹穿的比我還像新娘。我一直安慰自己滓玖,他們只是感情好坪哄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著势篡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪模暗。 梳的紋絲不亂的頭發(fā)上禁悠,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音兑宇,去河邊找鬼碍侦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓷产。 我是一名探鬼主播站玄,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼濒旦!你這毒婦竟也來了株旷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤尔邓,失蹤者是張志新(化名)和其女友劉穎晾剖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梯嗽,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灯节。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片循头。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炎疆,靈堂內(nèi)的尸體忽然破棺而出贷岸,到底是詐尸還是另有隱情,我是刑警寧澤磷雇,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布偿警,位于F島的核電站,受9級(jí)特大地震影響唯笙,放射性物質(zhì)發(fā)生泄漏螟蒸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一崩掘、第九天 我趴在偏房一處隱蔽的房頂上張望七嫌。 院中可真熱鬧,春花似錦苞慢、人聲如沸诵原。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍赛。三九已至,卻和暖如春辑畦,著一層夾襖步出監(jiān)牢的瞬間吗蚌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工纯出, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚯妇,地道東北人敷燎。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像箩言,于是被迫代替她去往敵國和親硬贯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354