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

Posted on 2020/09/03

はじめに

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

1
2
3
4
5
        registration:
          myspring:
            scope:
            - openid
            - extrainfo

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

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

1
2
3
4
5
6
7
8
9
    @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 + ".";
    }