claimとscopeを追加して取得してみる
   2 min read

はじめに

Keycloak上で新しいclaimと、それを取得できる新しいscopeを定義し、Spring Securityを使って参照してみます。

KeycloakをIdPにしてSpring Security OAuth 2.0 Login/Client を試してみる で作成したコードをベースにしています。

今回のコードはこちらです:

Keycloak上の設定手順

ユーザ属性(claim)追加

KeycloakをIdPにしてSpring Security OAuth 2.0 Login/Client を試してみる のときと同様に、管理者でログインします。

Users 設定画面から以前作成したユーザ myuser の編集を行います。

myuser の編集画面で Attrributes タブを開き、次のレコードを作成し、保存します。

Key

fav-number

Value

8

scope追加

Client Scopesを選択し、表の右上 Create ボタンを押します。

次の情報を入力し、 Save します。

Name

extrainfo

つづいて Mappers タブを開きます。 Create ボタンを押し、次の情報を入力します。

Name

extrainfo mapper

Mapper Type

User Attribute

User Attribute

fav-number

Token Claim Name

fav-number

Claim JSON Type

int

Add to ID token

OFF

Add to access token

OFF

Add to usrinfo

ON (デフォルトのまま)

クライアントから取得できるようにする

Clients 画面で myclient を選択し、 Client Scopes タブを開きます。

Optional Client Scopes で、 extrainfoAssined Optional Client Scopes に移します。

Spring Bootの設定

scope追加

application.yml で設定している registration に、今回追加で取得するscope extrainfo 追加します。

application.yml
        registration:
          myspring:
            scope:
            - openid
            - extrainfo

取得した情報を表示してみる

コントローラで情報を取得してみます。

    @GetMapping
    public String index() {
        final Authentication authn = SecurityContextHolder.getContext().getAuthentication();
        log.info("Authentication: {}", authn);

        final OAuth2User user = ((OAuth2AuthenticationToken) authn).getPrincipal();
        final Object favNum = user.getAttribute("fav-number");
        return "Hello " + authn.getName() + "! Your fav is " + favNum + ".";
    }