목차
질문 내용
Workaround
Java OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제

OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제

Feb 13, 2024 pm 03:51 PM

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();
  }
  
}
로그인 후 복사

Workaround

가 제공된 토큰을 생성했으며 roles 字段设置为 ROLE_ADMIN。在 jwtAuthenticationConverter() 中,您尝试将 setAuthorityPrefixROLE 一起使用,导致 ROLE_ROLE_ADMIN.

이 문제를 수정하려면 줄을 grantedAuthoritiesConverter.setAuthorityPrefix("");로 변경하세요.

이 조정을 수행한 후에는 문제가 해결되어야 합니다. 다른 문제가 발생하면 알려주시기 바랍니다.

주의:

이 단계를 생략하면 기본 접두사는 SCOPE,导致您的角色变为 SCOPE_ROLE_ADMIN가 됩니다.

위 내용은 OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)