OAuth 2.0 リソース サーバー JWT を使用したアクセス許可 (認可) の問題
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック







