ホームページ >Java >OAuth 2.0 リソース サーバー JWT を使用したアクセス許可 (認可) の問題

OAuth 2.0 リソース サーバー JWT を使用したアクセス許可 (認可) の問題

WBOY
WBOY転載
2024-02-13 15:51:091004ブラウズ

OAuth 2.0 リソース サーバー JWT を使用すると、権限 (認可) の問題が発生することがあります。これは、多くの開発者が開発プロセス中に頻繁に遭遇する課題です。 OAuth 2.0 は、ユーザーがサードパーティのアプリケーションが保護されたリソースにアクセスすることを承認できるようにする承認のオープン標準です。 JWT (JSON Web Token) は、Web アプリケーション間でクレームを渡す方法です。ただし、実際には、認可の失敗、アクセス トークンの取得の失敗など、いくつかの権限の問題が発生する可能性があります。この記事では、これらの問題を分析し、開発者が OAuth 2.0 リソース サーバー JWT をより効果的に使用できるようにするためのいくつかの解決策を提供します。

質問内容

oauth 2.0 リソースサーバー jwt を使用して、簡単なアプリケーションで jwt を使用したアクセス認可を構成しようとしています。

認証部分全体は正常に動作していますが、認証で問題が発生しています。トークンに正しい権限が存在する場合でも、すべての保護されたエンドポイントで 403禁断エラーが発生します。

デフォルトのスコープ (scope_) 属性を使用し、構成をロール (role_) に変更しようとしましたが、問題は解決しません。

解決方法を知っている人はいますか?

完全なソースコード: https://github.com/gustavosc1/spring-security-jwt

トークンの生成例: eyjhbgcioijsuzi1nij9.eyjpc3mioijzchjpbmctc2vjdxjpdhktand0iiwic3viijoidxnlcm5hbwuilcjlehaioje3mdu0ndmyotqsimlhdci6mtcwntqwnzi5ncwicm9szxmi oijst0xfx0fetuloin0. peiv wrthx_7mr6eefqbid5dplhffzcvd7scmmt3f7rk7sk1i6kerpqi5ubdvaefnzsjq6vka5nadltsbqidfzogmoixjktfhsc5zrnyyrhikvnwcwb3wrgdd1ezgihaldfjxwxsyypau njwdxznirkl93e6mg1uao5piy9p- 9yp8jer7o31wkdr1coskzk3gqw42uecib9h1rrlkx9pdk7pf9rtfssfcwc-ntvismrycreco9rialqfydpdzeojimcbqveyboqfhn2woepgdm8mr5zsdhgdq e1ivsibfbcj_0486zuqiksxp2kniljhl2b5qnan0 7f jpvslk--ccsg

セキュリティ構成:

リーリー

ユーザー詳細サービスimpl:

リーリー

ユーザー認証済み:

リーリー

jwtサービス:

リーリー

プライベートコントローラー:

@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() で、setAuthorityPrefixROLE とともに使用しようとすると、結果は ROLE_ROLE_ADMIN になります。

この問題を修正するには、この行を grantedAuthoritiesConverter.setAuthorityPrefix(""); に変更します。

この調整を行った後、問題は解決されるはずです。他に問題が発生した場合は、お知らせください。

######知らせ:######

この手順を省略すると、デフォルトのプレフィックスは SCOPE になり、ロールは

SCOPE_ROLE_ADMIN

になります。

以上がOAuth 2.0 リソース サーバー JWT を使用したアクセス許可 (認可) の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。