簡體   English   中英

如何從外部 IDP 讀取/導入角色到 Keycloak

[英]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 Typepublic且僅啟用一種流,即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 TypeConfidential

第二個領域是第一個領域的 IDP。 因此,要登錄用戶,請轉到Central登錄頁面並選擇 IDP SpringAppIDP

IDP配置如下:

  • aliasSpringAppIDP ,除啟用選項外,其他所有內容均OFF
  • 授權 URL、令牌 URL 等設置為來自SpringApp端點的 URL( eg, Authorization URLhttp : //127.0.0.1 : 8080/ SpringApp
  • Client ID 和 Client secret 分別是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 中? 或者,如果(以及如何)我可以代表用戶請求令牌,該令牌將在該令牌中具有來自CentralSpringWeb Realm 的用戶角色,而不必為每個用戶角色顯式創建角色映射器。

我想知道是否可以將角色從外部 IDP 顯式導入到內部 IDP 中? 或者,如果(以及如何)我可以代表用戶請求令牌,該令牌將在該令牌中具有來自 Central 和 SpringWeb Realm 的用戶角色,而不必為每個用戶角色顯式創建角色映射器。

沒有為每個用戶角色顯式創建角色映射器,我發現的唯一解決方案是擴展 Keycloak 代碼; 這有明顯的缺點。

回想起來,Keycloak 沒有提供開箱即用的方式來自動從外部IDP 導入所有角色,這實際上是有道理的。 例如,如果我使用 Google 作為外部 IDP,我的內部 IDP(Keycloak)為什么要關心 Google 使用的角色的確切名稱?!。 最有可能的是,這些角色對於內部 IDP 來說毫無意義,當它們有意義時,它們可能有不同的名稱。 無論如何,對於這些例外情況,可以使用角色映射器功能。

盡管如此,為了使過程自動化,我創建了一個文件,將內部IDP 的角色映射到外部IDP,例如:

ROLE A | ROLE B
....

我還有一個帶有角色映射器示例模板的 JSON 文件,其中包含一些稍后要替換的標簽(例如,字段roleexternal.role )。

使用腳本,我讀取具有角色之間映射的文件,並使用Keycloak Admin REST API創建角色、映射器等。

我使用的邏輯如下:

  • 如果外部IDP 中不存在該角色,則我只是跳過並假設這是一個錯誤;
  • 如果內部IDP 中不存在該角色,則將其創建為 Realm 角色; 為此,我使用端點POST /{realm}/roles
  • 最后,我使用端點POST /{realm}/identity-provider/instances/{alias}/mappersJSON模板角色映射器文件的內容(相應地替換其標簽)創建角色映射器。

對於沒有創造外部IDP境界角色的理由是,所有從外部IDP的角色應該已經被從LDAP仍要加載。 對於內部IDP,我確實創建了,因為對於映射 1 到 1,來自 LDAP(加載到外部IDP)的角色尚未在內部IDP 上創建是可以預期的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM