claimとscopeを追加して取得してみる
はじめに
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 で、 extrainfo を Assined Optional Client Scopes に移します。
Spring Bootの設定
scope追加
application.yml で設定している registration に、今回追加で取得するscope extrainfo 追加します。
        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 + ".";
    }