[英]How can one read/import the roles from an external IDP into Keycloak
我有一個使用 Keycloak 11.0.2 保護的 Spring Boot 應用程序,我的 Keycloak 設置如下:
Central
的 Realm,具有一個角色CentralWebUser
和一個客戶端SpringWeb
。 客戶有
Access Type
: public
且僅啟用一種流,即Standard Flow Enabled
Valid Redirect URIs
:http://localhost:8000/*SpringApp
的 2ª 領域,具有角色WebUser
和客戶端spring_brokering
WebUser
名為springuser
的用戶spring_brokering
只有Standard Flow Enabled
設置為 ON、 Valid Redirect URIs
:http://localhost:8080/* 和Access Type
: Confidential
第二個領域是第一個領域的 IDP。 因此,要登錄用戶,請轉到Central
登錄頁面並選擇 IDP SpringAppIDP
。
IDP配置如下:
alias
: SpringAppIDP
,除啟用選項外,其他所有內容均OFF
SpringApp
端點的 URL( eg,
Authorization URL
: http : //127.0.0.1 : 8080/ SpringApp
)spring_brokering
和它的 secret。在 Spring 方面,我有以下值得一提的屬性:
server.port = 8000
keycloak.realm = Central
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = SpringWeb
keycloak.public-client=true
keycloak.security-constraints[0].authRoles[0]=WebUser
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/services/*
當我訪問http://127.0.0.1:8080/services
我被重定向到 Keycloak Central
Realm 登錄頁面,然后單擊SpringAppIDP
並輸入用戶名springuser
及其密碼。 登錄成功,但我得到了拒絕訪問,這意味着用戶springuser
沒有角色WebUser
。 但是,該角色已分配給第二個領域(即SpringApp
)中的該用戶。
有趣的是,如果在第一個 Realm 中,我創建了一個身份提供者 Mapper External Role to Role
(在 IDP SpringAppIDP
配置中)將WebUser
的外部角色映射到CentralWebUser
並將 spring 屬性更改為:
keycloak.security-constraints[0].authRoles[0]=CentralWebUser
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/services/*
我能夠登錄,這意味着 Keycloak 知道用戶具有WebUser
角色,因此將該角色映射到CentralWebUser
角色。
我想知道是否可以將角色從外部 IDP 顯式導入到內部 IDP 中? 或者,如果(以及如何)我可以代表用戶請求令牌,該令牌將在該令牌中具有來自Central
和SpringWeb
Realm 的用戶角色,而不必為每個用戶角色顯式創建角色映射器。
我想知道是否可以將角色從外部 IDP 顯式導入到內部 IDP 中? 或者,如果(以及如何)我可以代表用戶請求令牌,該令牌將在該令牌中具有來自 Central 和 SpringWeb Realm 的用戶角色,而不必為每個用戶角色顯式創建角色映射器。
沒有為每個用戶角色顯式創建角色映射器,我發現的唯一解決方案是擴展 Keycloak 代碼; 這有明顯的缺點。
回想起來,Keycloak 沒有提供開箱即用的方式來自動從外部IDP 導入所有角色,這實際上是有道理的。 例如,如果我使用 Google 作為外部 IDP,我的內部 IDP(即Keycloak)為什么要關心 Google 使用的角色的確切名稱?!。 最有可能的是,這些角色對於內部 IDP 來說毫無意義,當它們有意義時,它們可能有不同的名稱。 無論如何,對於這些例外情況,可以使用角色映射器功能。
盡管如此,為了使過程自動化,我創建了一個文件,將內部IDP 的角色映射到外部IDP,例如:
ROLE A | ROLE B
....
我還有一個帶有角色映射器示例模板的 JSON 文件,其中包含一些稍后要替換的標簽(例如,字段role
和external.role
)。
使用腳本,我讀取具有角色之間映射的文件,並使用Keycloak Admin REST API創建角色、映射器等。
我使用的邏輯如下:
POST /{realm}/roles
POST /{realm}/identity-provider/instances/{alias}/mappers
和JSON
模板角色映射器文件的內容(相應地替換其標簽)創建角色映射器。對於沒有創造外部IDP境界角色的理由是,所有從外部IDP的角色應該已經被從LDAP仍要加載。 對於內部IDP,我確實創建了,因為對於映射 1 到 1,來自 LDAP(加載到外部IDP)的角色尚未在內部IDP 上創建是可以預期的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.