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()
で、setAuthorityPrefix
を ROLE
とともに使用しようとすると、結果は ROLE_ROLE_ADMIN
になります。
この問題を修正するには、この行を grantedAuthoritiesConverter.setAuthorityPrefix("");
に変更します。
この調整を行った後、問題は解決されるはずです。他に問題が発生した場合は、お知らせください。
######知らせ:######この手順を省略すると、デフォルトのプレフィックスは SCOPE になり、ロールは
SCOPE_ROLE_ADMIN になります。
以上がOAuth 2.0 リソース サーバー JWT を使用したアクセス許可 (認可) の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。