簡體   English   中英

Keycloak 將自定義屬性檢索到 KeycloakPrincipal

[英]Keycloak retrieve custom attributes to KeycloakPrincipal

在我的 rest 服務中,我可以在使用身份驗證后獲取主體信息

KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();

陳述。

Keycloak 主體不包含我需要的有關經過身份驗證的用戶的所有信息。 是否可以自定義我自己的主體類型? 在 keycloak-server-end 我開發了一個用戶聯合提供者。 我看到 UserModel 可以為我的用戶添加一組自定義屬性。

是否可以在該代碼中插入我的自定義主體?

是否可以從 keycloak 主體中檢索此屬性?

方法是什么?

要添加自定義屬性,您需要做三件事:

  1. 向管理控制台添加屬性
  2. 添加聲明映射
  3. 訪問聲明

第一個在這里解釋得很好: https : //www.keycloak.org/docs/latest/server_admin/index.html#user-attributes

添加聲明映射:

  1. 打開您領域的管理控制台。
  2. 轉到客戶端並打開您的客戶端
  3. 這僅適用於設置 > 訪問類型機密或公開(非承載)
  4. 轉到映射器
  5. 創建從屬性到 json 的映射
  6. 選中“添加到 ID 令牌”

訪問聲明:

final Principal userPrincipal = httpRequest.getUserPrincipal();

if (userPrincipal instanceof KeycloakPrincipal) {

    KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;
    IDToken token = kp.getKeycloakSecurityContext().getIdToken();

    Map<String, Object> otherClaims = token.getOtherClaims();

    if (otherClaims.containsKey("YOUR_CLAIM_KEY")) {
        yourClaim = String.valueOf(otherClaims.get("YOUR_CLAIM_KEY"));
    }
} else {
    throw new RuntimeException(...);
}

希望這有助於並適合您的用例。 我將此用於添加自定義主題的自定義屬性。

  • 選擇用戶 > 查找 > 單擊 ID > 轉到屬性選項卡 > 添加屬性 > 例如:電話 > 保存在此處輸入圖片說明

  • 選擇客戶端 > 單擊客戶端 ID > 轉到映射器選項卡 > 創建映射器

    在此處輸入圖片說明

    在此處輸入圖片說明

    在此處輸入圖片說明

  • 獲取自定義屬性

    在此處輸入圖片說明

    在此處輸入圖片說明

更新

  • 在組級別添加“電話”屬性,將用戶分配到該組,然后您從所有用戶的組級別獲得“電話”屬性

  • 返回映射器並使用“Aggregate attribute values = true”和“Multivalued=true”更新“phone”,您將獲得“phone”作為包含組和用戶級別屬性的列表。 如果您保留 'Aggregate attribute values = false' 或 'Multivalued=false',您只會得到一個值,其中來自用戶的 'phone' 屬性將覆蓋來自組的 'phone' 屬性(這是有道理的)

對於 Keycloak > 18,映射器的配置已在 UI 中移動:

Clients > Your selected clientClient Scopes選項卡下選擇的客戶,必須 select account-dedicated

在此處輸入圖像描述

可以添加自定義映射器:

在此處輸入圖像描述

暫無
暫無

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

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