Spring SecurityとJWTでJava Rest APIを保護します
Spring BootアプリケーションにJWTベースのREST APIセキュリティメカニズムを実装するには、まず、ユーザーがログインした後にサーバーがJWTを発行することを理解する必要があります。クライアントは、後続のリクエストの承認ヘッダーでトークンを運び、サーバーはカスタムフィルターを介してトークンの有効性を検証します。 2。POM.xmlにSpring-Boot-Starter-Security、Spring-Boot-Starter-Web、JJWT-API、JJWT-IMPL、JJWT-Jackson依存関係を追加します。 3. jwtutilツールクラスを作成して、ユーザー名、有効期限を抽出し、トークンを生成し、トークンが有効かどうかを確認する方法を含むJWTを生成、解析、検証します。 4.書き込みJWTREQUESTFILTERは、RequentPerRequestFilterを継承し、リクエストでBEARERトークンを抽出し、ユーザー名を解析し、ユーザーの詳細をロードします。トークンが有効な場合、認証をSecurityContextに設定します。 5. SecurityConfigクラスを構成し、CSRFを無効にし、リリースするパスを設定 /認証および /登録すること、およびその他のリクエストに認証が必要であり、Stateless Session Managementを設定してJWTREquestFilterをフィルターチェーンに追加します。 6.認証要求を処理するAuthControllerを提供し、AuthenticationManagerを介して資格情報を検証し、JWTを生成し、成功後にAuthResponseを返します。 7.ユーザー情報を認証のためにロードするためのuserdetailsServiceを実装します。 8。セキュリティベストプラクティスには、HTTPSの使用、ハードコーディングキーの回避、合理的な有効期限の設定、ペイロードに機密情報の保存なし、発行者と視聴者の検証、および分散システムでのJWKの使用が含まれます。 Spring SecurityとJWTを統合することにより、ステートレスでスケーラブルなセキュリティアーキテクチャを実装でき、その後の役割許可と更新トークンメカニズムをサポートします。
Java Rest APIの保護は、特にJSON Web Tokens(JWT)などのステートレス認証メカニズムを使用する場合、最新のWebアプリケーションで重要な要件です。 JWTと組み合わせたSpring Securityは、エンドポイントを保護するための堅牢で柔軟な方法を提供します。 Spring Bootアプリケーションで効果的に実装する方法は次のとおりです。

1。アーキテクチャの理解
コードに飛び込む前に、フローを理解することが重要です。
- ユーザーはログイン資格情報(ユーザー名とパスワードなど)を送信します。
- サーバーはそれらを検証し、JWTを返します。
- クライアントは、後続のリクエストのために、
Authorization
ヘッダー(Bearer <token></token>
として)にこのJWTを含めます。 - サーバーは、アクセスを許可する前にフィルターを使用して各リクエストのトークンを検証します。
Spring Securityは認証と承認を処理しますが、カスタムフィルターはJWTを検証するリクエストを傍受します。

2.必要な依存関係を追加します
pom.xml
には、以下を含めます。
<依存関係> <依存関係> <GroupId> org.springframework.boot </groupId> <artifactid> spring-boot-starter-security </artifactid> </依存関係> <依存関係> <GroupId> org.springframework.boot </groupId> <artifactid> spring-boot-starter-web </artifactid> </依存関係> <依存関係> <groupId> io.jsonwebtoken </groupId> <Artifactid> jjwt-api </artifactid> <バージョン> 0.11.5 </version> </依存関係> <依存関係> <groupId> io.jsonwebtoken </groupId> <artifactid> jjwt-impl </artifactid> <バージョン> 0.11.5 </version> <scope>ランタイム</scope> </依存関係> <依存関係> <groupId> io.jsonwebtoken </groupId> <artifactid> jjwt-jackson </artifactid> <バージョン> 0.11.5 </version> <scope>ランタイム</scope> </依存関係> </依存関係>
3. JWTユーティリティクラスを作成します
このクラスは、トークンの生成、検証、抽出を処理します。

@成分 パブリッククラスjwtutil { プライベート最終文字列Secret_key = "yoursecretkeythatislongenoughforhs512"; //強力なキーを使用します プライベート最終int expation_time = 86400000; // 24時間 public string extractusername(string token){ extractclaimを返します(token、clailes :: getSubject); } パブリックデートExtractexpiration(String Token){ extractclaimを返します(token、クレーム:: getexpiration); } public <t> t extractclaim(string token、function <chails、t> rackesresolver){ 最終的なクレームクレーム= extractallclaims(トークン); runtriceResolver.Apply(クレーム); } プライベートクレームは抽出されています(String Token){ return jwts.parser()。setsingkey(secret_key).parsecalimsjws(token).getbody(); } private boolean istokenexpired(string token){ extractexpiration(token).before(new date()); } public string generateToken(userdetails userdetails){ map <string、object> racks = new Hashmap <>(); return createToken(claims、userdetails.getusername()); } private string createToken(map <string、object> claiks、string subject){ jwts.builder()を返します .setclaims(クレーム) .setsubject(subject) .setissuedat(new Date(system.currenttimemillis()))) .setexpiration(new Date(System.CurrentTimemillis()expiration_time)) .signwith(signaturealgorithm.hs512、secret_key) 。コンパクト(); } public boolean validAteToken(String Token、userDetails userdetails){ final string username = extractusername(token); return(username.equals(userdetails.getusername())&&!istokenexpired(token)); } }
4.カスタムJWT認証フィルター
このフィルターは、ほとんどのスプリングセキュリティチェックの前に実行され、 Authorization
ヘッダーからJWTを検証します。
@成分 パブリッククラスJWTREQUESTFILTERはwoneperRequestFilter { @Autowired Private userDetailsService userDetailsService; @Autowired Private Jwtutil Jwtutil; @オーバーライド 保護されたvoid dofilterinternal(httpservletrequestリクエスト、httpservletresponse応答、フィルターチェーンチェーン) ServletException、ioException { 最終文字列authorizationheader = request.getheader( "authorization"); 文字列username = null; 文字列jwt = null; if(authorizationheader!= null && authorizationheader.startswith( "Bearer")){ jwt = authorizationheader.substring(7); username = jwtutil.extractusername(jwt); } if(username!= null && securitycontextholder.getContext()。getAuthentication()== null){ userdetails userdetails = this.userdetailssersvice.loduserbyusername(username); if(jwtutil.validatetoken(jwt、userdetails)){ usernamepasswordauthenticationtoken authtoken = new usernamepasswordauthenticationtoken( userdetails、null、userdetails.getauthorities()); authtoken.setdetails(new webauthenticationdetailssource()。builddetails(request)); SecurityContextholder.getContext()。setAuthentication(authtoken); } } Chain.dofilter(リクエスト、応答); } }
5.スプリングセキュリティを構成します
WebSecurityConfigurerAdapter
をオーバーライドします(または、新しいバージョンでコンポーネントベースの構成を使用します)。
@構成 @enablewebsecurity Public Class SecurityConfigは、websecurityconfigurerAdapterを拡張します{ @Autowired Private userDetailsService userDetailsService; @Autowired プライベートJWTREQUESTFILTER JWTREQUESTFILTER; @bean public PasswordEncoder passwordEncoder(){ 新しいbcryptpasswordencoder()を返します。 } @オーバーライド 保護されたvoid configure(authenticationmanagerbuilder auth)スロー例外{ auth.userdetailsservice(userdetailsservice).passwordencoder(passhipencoder()); } @bean @オーバーライド public AuthenticationManager AuthenticationManagerbean()スロー例外{ super.authenticationmanagerbeanを返します(); } @オーバーライド 保護されたvoid configure(httpsecurity http)スロー例外{ http.csrf()。disable() .authorizerequests() .AntMatchers( "/authenticate")。pimitall() .AntMatchers( "/Register")。permitall() .anyrequest()。authentipted() 。そして() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.Stateless); http.addfilterbefore(jwtrequestfilter、usernamepasswordauthenticationfilter.class); } }
注: Spring Boot 3では、
WebSecurityConfigurerAdapter
拡張する代わりに、SecurityFilterChain
Beanを使用します。
6.認証エンドポイントを作成します
@RestController パブリッククラスAuthController { @Autowired Private AuthenticationManager AuthenticationManager; @Autowired Private userDetailsService userDetailsService; @Autowired Private Jwtutil Jwtutil; @postmapping( "/authenticate") public ResponseNtity <? 試す { authenticationmanager.authenticate( new usernamepasswordauthenticationtoken(authrequest.getusername()、authrequest.getpassword()) ); } catch(badcredentialsexception e){ 新しい例外をスローします(「誤ったユーザー名またはパスワード」、e); } final userdetails userdetails = userdetailsservice.loduserbyusername(authrequest.getusername()); 最終文字列jwt = jwtutil.generatetoken(userdetails); RESPONSENTENTITY.ok(new authResponse(JWT)); } }
DTOで:
パブリッククラスAuthRequest { プライベート文字列ユーザー名; プライベート文字列パスワード。 //ゲッターとセッター } パブリッククラスのauthresponse { プライベートストリングトークン; public authResponse(string token){this.token = token; } // getter }
7。USERDETAILSSSERVICEの実装
@サービス パブリッククラスmyuserdetailsservice emplesient userdetailsservice { @Autowired Private UserrePository UserrePository; @オーバーライド public userdetails loaduserbyusername(string username){ ユーザーユーザー= ueserrepository.findbyusername(username) .orelsethrow(() - > new usernamenotfoundexception( "user not found")); 新しいorg.springframework.security.core.userdetails.userを返します( user.getUsername()、user.getPassWord()、new ArrayList <>()); } }
8。ベストプラクティスとセキュリティのヒント
- 生産でHTTPSを使用します- JWTは敏感です。
- シークレットキーを安全に保ちます- ソースにハードコードはありません。環境変数または秘密管理ツールを使用します。
- 合理的なトークンの有効期限を設定します- リフレッシュトークンを備えた短命のトークンの方が良いです。
- JWTペイロードに機密データの保存を避けてください。これは、暗号化されていないbase64エンコードです。
- 生産グレードアプリで発行者と視聴者の請求を検証します。
- 分散システムにJWK(JSON Webキーセット)を使用することを検討してください。
まとめ
Spring SecurityとJWTを組み合わせることで、REST APIを保護するためのクリーンでステートレスの方法が得られます。重要なコンポーネントは次のとおりです。
- トークンの作成/検証のためのJWTユーティリティ
- リクエストを傍受および認証するためのフィルター
- 適切なスプリングセキュリティ構成
- トークンを発行するためのログインエンドポイント
このセットアップは広く使用され、スケーラブルで、FrontEndフレームワークやモバイルアプリとよく統合されています。
基本的に、基礎が整ったら、役割、権限を拡張するか、更新トークンの追加が管理しやすくなります。
以上がSpring SecurityとJWTでJava Rest APIを保護しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

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

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

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

JDBCトランザクションを正しく処理するには、最初に自動コミットモードをオフにし、次に複数の操作を実行し、結果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複数のSQL操作を実行します。 3。すべての操作が成功した場合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場合はconn.rollback()を呼び出します。同時に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設定して部分的なロールバックを達成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお勧めします。

仮想スレッドには、非常に並行したシナリオとIO集約型シナリオに大きなパフォーマンスの利点がありますが、テスト方法と適用可能なシナリオに注意を払う必要があります。 1.正しいテストでは、実際のビジネス、特にIOブロッキングシナリオをシミュレートし、JMHやガトリングなどのツールを使用してプラットフォームスレッドを比較する必要があります。 2。スループットのギャップは明らかであり、スケジューリングがより軽量で効率的であるため、100,000の同時リクエストよりも数倍から10倍高くなる可能性があります。 3。テスト中に、盲目的に高い並行性数を追求し、非ブロッキングIOモデルに適応し、レイテンシやGCなどの監視インジケーターに注意を払う必要があります。 4.実際のアプリケーションでは、Webバックエンド、非同期タスク処理、および多数の同時のIOシナリオに適していますが、CPU集約型タスクはプラットフォームスレッドまたはForkjoinpoolに依然として適しています。

tosetjava_homeonwindows、firstlocatethejdkinstallationpath(例:c:\ programfiles \ java \ jdk-17)、thencreateSystemenvironmentvaria blenamedjava_homewiththatpath.next、updatethepathvariablebyadding%java \ _home%\ bin、andverifythesetusingingingjava-versionandjavac-v

ServiceMeshは、Java Microservice Architectureの進化のための避けられない選択であり、その中心はネットワークロジックとビジネスコードの分離にあります。 1. ServiceMeshは、ビジネスに焦点を当てるために、サイドカーエージェントを介したロードバランシング、ヒューズ、監視、その他の機能を処理します。 2。ISTIO使節は中程度および大規模なプロジェクトに適しており、Linkerdは軽量で小規模な試験に適しています。 3. Java Microservicesは、発見とコミュニケーションのために、装い、リボン、その他のコンポーネントを閉鎖し、IStiodに引き渡す必要があります。 4.展開中にサイドカーの自動注入を確保し、トラフィックルールの構成、プロトコル互換性、ログトラッキングシステムの構築に注意を払い、増分移行とコントロール前の監視計画を採用します。

リンクリストを実装する鍵は、ノードクラスを定義し、基本操作を実装することです。 firstデータや次のノードへの参照を含むノードクラスを作成します。次に、LinkedListクラスを作成し、挿入、削除、および印刷機能を実装します。 deppentedメソッドは、テールにノードを追加するために使用されます。 printlistメソッドを使用して、リンクリストのコンテンツを出力します。 dreatewithValueメソッドは、指定された値を持つノードを削除し、ヘッドノードと中間ノードのさまざまな状況を処理するために使用されます。

サーバー側のテンプレートインジェクション(SSTI)の防止には、次の4つの側面が必要です。1。メソッド呼び出しの無効化やクラスの負荷の制限など、セキュリティ構成を使用します。 2.ユーザー入力はテンプレートコンテンツとして回避し、可変交換のみを避け、入力を厳密に検証します。 3.小石、口ひげ、レンダリングコンテキストなどのサンドボックス環境を採用します。 4.従属バージョンを定期的に更新し、コードロジックを確認して、テンプレートエンジンが合理的に構成されていることを確認し、ユーザー制御可能なテンプレートのためにシステムが攻撃されないようにします。

Java Collection Frameworkのパフォーマンスを向上させるために、次の4つのポイントから最適化できます。1。アレイリストへの頻繁なランダムアクセス、ハッシュセットへのクイック検索、同時環境の同時ハッシュマップなど、シナリオに従って適切なタイプを選択します。 2.初期化中に容量と荷重係数を合理的に設定して、容量の拡張オーバーヘッドを減らしますが、メモリ無駄を避けます。 3.不変のセット(list.of()など)を使用して、一定または読み取り専用データに適したセキュリティとパフォーマンスを改善します。 4.メモリの漏れを防ぎ、弱い参照またはプロのキャッシュライブラリを使用して、長期生存セットを管理します。これらの詳細は、プログラムの安定性と効率に大きく影響します。

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。
