Spring BootでJWTアクセストークンのpermissionsで認可する – 【Auth0】

Spring BootでJWTアクセストークンのpermissionsで認可する – 【Auth0】

認可において、JWTのscope属性ではなくpermissions属性を見るように設定します。

dependencies

依存関係です。

implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'

SecurityConfig.java

用意したAPIと必要な権限です。permissions属性にそれぞれの権限がないと403エラーにになります。

API 権限
/api/private-read-scoped read:message
/api/private-write-scoped write:message

SecurityConfig.java

package jp.co.confrage.auth0.config.security;


import java.util.Collection;
import java.util.stream.Collectors;

import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.converter.Converter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/api/private-read-scoped").hasAuthority("read:message")
                .mvcMatchers("/api/private-write-scoped").hasAuthority("write:message")
                .and().cors()
                .and().oauth2ResourceServer().jwt().jwtAuthenticationConverter(grantedAuthoritiesExtractor());
        return http.build();
    }

    Converter<Jwt, AbstractAuthenticationToken> grantedAuthoritiesExtractor() {
        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
        converter.setJwtGrantedAuthoritiesConverter(new GrantedAuthoritiesExtractor());
        return converter;
    }

    static class GrantedAuthoritiesExtractor implements Converter<Jwt, Collection> {
        public Collection convert(Jwt jwt) {
            Collection authorities = (Collection)jwt.getClaims().get("permissions"); // permissions属性を取得するように指定
            return authorities.stream()
                    .map(SimpleGrantedAuthority::new)
                    .collect(Collectors.toList());
        }
    }
}

参考サイト

12. OAuth2
Spring Boot + Auth0 でシンプルな認証・認可 (RBAC) を実装する - Qiita
はじめに 本投稿では Auth0 の ID Token と Spring Boot にて RBAC を実現する方法を記述する。 実現方法 MP-JWT を模倣し、ID Token に権限情報をカスタムクレームとして付与する...
Spring Boot security JWT hasAuthority not work properly
I secure our Spring Boot API with Auth0 and JWT. When I decode JWT the result is: { "iss": " "sub": "auth0|62483c747a251...

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました