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
404 Not Found - Qiita - Qiita
Just a moment...

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^

コメント