web-dev-qa-db-ja.com

Keycloakは、カスタム属性をKeycloakPrincipalに取得します

私の休息サービスでは、認証後にプリンシパル情報を取得できます

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

ステートメント。

Keycloakプリンシパルには、認証されたユーザーについて必要な情報がすべて含まれていません。自分のプリンシパルタイプをカスタマイズすることは可能ですか? keycloak-server-endで、ユーザーフェデレーションプロバイダーを開発しました。 UserModelを使用すると、ユーザーに一連のカスタム属性を追加できることがわかりました。

そのコードにカスタムプリンシパルを挿入することは可能ですか?

Keycloakプリンシパルからこの属性を取得することは可能ですか?

方法は?

30
Alex

カスタム属性を追加するには、次の3つのことを行う必要があります。

  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(...);
}

これがユースケースに役立ち、適合することを願っています。カスタムテーマで追加したカスタム属性にこれを使用しました。

61
lisa p.
  • [ユーザー]> [ルックアップ]を選択し、[ID]をクリック> [属性]タブに移動> [属性の追加]>例:電話>保存 enter image description here

  • クライアントを選択>クライアントIDをクリック>マッパータブに移動>マッパーを作成

    enter image description here

    enter image description here

    enter image description here

  • カスタム属性を取得する

    enter image description here

    enter image description here

更新

  • グループレベルで「電話」属性を追加し、そのグループにユーザーを割り当てると、すべてのユーザーのグループレベルから「電話」属性が取得されます。

  • マッパーに戻り、「Aggregate attribute values = true」および「Multivalued = true」で「phone」を更新すると、グループおよびユーザーレベルの両方の属性を持つ「phone」がリストとして取得されます。 「Aggregate attribute values = false」または「Multivalued = false」を保持する場合、ユーザーからの「phone」属性がグループからの「phone」属性を上書きする値を1つだけ取得します(これは理にかなっています)

29
Neeraj Benjwal