OAuth 2.0 리소스 서버 JWT를 사용할 때 권한(인증) 문제가 발생할 수 있습니다. 이는 많은 개발자가 개발 과정에서 자주 직면하는 문제입니다. OAuth 2.0은 사용자가 타사 애플리케이션에 보호된 리소스에 액세스할 수 있는 권한을 부여할 수 있는 개방형 인증 표준입니다. JWT(JSON 웹 토큰)는 웹 애플리케이션 간에 클레임을 전달하는 방법입니다. 그러나 실제로는 인증 실패, 액세스 토큰 획득 실패 등 일부 권한 문제가 발생할 수 있습니다. 이 기사에서는 이러한 문제를 분석하고 개발자가 OAuth 2.0 리소스 서버 JWT를 더 잘 사용하는 데 도움이 되는 몇 가지 솔루션을 제공합니다.
간단한 애플리케이션에서 oauth 2.0 리소스 서버 jwt를 사용하여 접근 권한을 구성하려고 합니다.
전체 인증 부분은 잘 작동하지만 인증에 문제가 있습니다. 토큰에 올바른 권한이 있더라도 모든 보호된 엔드포인트에서는 403 forbidden
오류가 발생합니다.
기본 범위(scope_) 속성을 사용하고 구성을 역할(role_)로 변경해 보았지만 문제가 지속됩니다.
혹시 해결방법 아시는 분 계신가요?
전체 소스 코드: https://github.com/gustavosc1/spring-security-jwt
토큰 생성 예시: eyjhbgcioijsuzi1nij9.eyjpc3mioijzchjpbmctc2vjdxjpdhktand0iiwic3viijoidxnlcm5hbwuilcjlehaioje3mdu0ndmyotqsimlhdci6mtcwntqwnzi5ncwicm9szxmi oijst0xfx0 fe tuloin0.peivwrthx_7mr6eefqbid5dplhffzcvd7scmmt3f7rk7sk1i6kerpqi5ubdvaefnzsjq6vka5nadltsbqidfzogmoixjktfhsc5zrnyyrhikvnwcwb3wrgdd1ezgihaldfjxwxsyypau njwdxznirkl93e6mg1ua o 5piy9p-9yp8jer7o31wkdr1coskzk3gqw42uecib9h1rrlkx9pdk7pf9rtfssfcwc-ntvismrycreco9rialqfydpdzeojimcbqveyboqfhn2woepgdm8mr5zsdhgdq e1ivsibfbcj_0486zuqiksxp2knil j hl2b5qnan07fjpvslk--ccsg
보안 구성:
으아아아userdetailsserviceimpl:
으아아아사용자 확인:
으아아아jwtservice:
으아아아개인 컨트롤러:
@configuration @enablewebsecurity //@enablemethodsecurity(prepostenabled = true) public class securityconfig { @value("${jwt.public.key}") private rsapublickey key; @value("${jwt.private.key}") private rsaprivatekey priv; @bean securityfilterchain filterchain(httpsecurity http) throws exception { http.csrf(csrf -> csrf.disable()) .authorizehttprequests( auth -> auth .requestmatchers("/authenticate").permitall() .requestmatchers("/register").permitall() .requestmatchers("/private").hasanyrole("admin")) .httpbasic(customizer.withdefaults()) // https://docs-spring-io.translate.goog/spring-security/reference/servlet/oauth2/resource-server/jwt.html?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-br&_x_tr_pto=sc .oauth2resourceserver( conf -> conf.jwt( jwt -> jwt.decoder(jwtdecoder()) .jwtauthenticationconverter(jwtauthenticationconverter()))); return http.build(); } @bean public jwtauthenticationconverter jwtauthenticationconverter() { jwtgrantedauthoritiesconverter grantedauthoritiesconverter = new jwtgrantedauthoritiesconverter(); grantedauthoritiesconverter.setauthoritiesclaimname("roles"); grantedauthoritiesconverter.setauthorityprefix("role_"); jwtauthenticationconverter jwtauthenticationconverter = new jwtauthenticationconverter(); jwtauthenticationconverter.setjwtgrantedauthoritiesconverter(grantedauthoritiesconverter); return jwtauthenticationconverter; } @bean jwtdecoder jwtdecoder() { return nimbusjwtdecoder.withpublickey(this.key).build(); } @bean jwtencoder jwtencoder() { jwk jwk = new rsakey.builder(this.key).privatekey(this.priv).build(); jwksource<securitycontext> jwks = new immutablejwkset<>(new jwkset(jwk)); return new nimbusjwtencoder(jwks); } @bean passwordencoder passwordencoder() { return new bcryptpasswordencoder(); } }
가 제공된 토큰을 생성했으며 roles
字段设置为 ROLE_ADMIN
。在 jwtAuthenticationConverter()
中,您尝试将 setAuthorityPrefix
与 ROLE
一起使用,导致 ROLE_ROLE_ADMIN
.
이 문제를 수정하려면 줄을 grantedAuthoritiesConverter.setAuthorityPrefix("");
로 변경하세요.
이 조정을 수행한 후에는 문제가 해결되어야 합니다. 다른 문제가 발생하면 알려주시기 바랍니다.
주의:
이 단계를 생략하면 기본 접두사는 SCOPE
,导致您的角色变为 SCOPE_ROLE_ADMIN
가 됩니다.
위 내용은 OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!