プレートJWTの前端と後端とを分離学習SpringBootSecurity(13)

JWTの使用

デフォルトのログインページへの簡単な紹介の前には変更前と分離法の非同期インタフェースのログインが終了した後、あなたは、私たちは、基本的なフロントと分離ログインの後端を達成するのを助けることができます。しかし、この基本的なログインとフロントページが同じ場所に看板があり、ログイン状態を維持するために、セッションとクッキーの使用は、この方法の問題点は、貧弱なスケーラビリティということです。スタンドアローン、それはサーバのクラスタ、またはクロスドメインのサービス指向アーキテクチャーの場合はもちろん、何の問題は、それがセッションを共有するデータを必要とせず、各サーバは、セッションを読むことができます。

一つの解決策は、永続セッションデータである、またはその他の書面によるRedisのは、層を永続します。リクエストの様々なサービスの領収書は、すべての永続層にデータを要求しました。このアプローチの利点は明白な構造で、欠点は、エンジニアリングよりも大きくなっています。さらに、持続性を吊り下げた場合には、障害点を選抜します。

別のオプションは、サーバーがサーバーに、各要求をセッションデータを保存しませんし、すべてのデータがクライアントに保存されているだけです。JWTは、このプログラムの代表です。:JWT理論的な知識については、それが推奨され、参照ルアンYifeng偉大な神は、チュートリアルを書いたJSONウェブトークン入門チュートリアル、私はJWT、明確に書かれて達成するために、このチュートリアルに基づいて次のことを達成する可能性が最も高いと思います。

特定の理論的な知識は、ユーザー情報のヘッダにトークンを返し、正常にユーザーがログインした後、単にプロセスの下で、ここで、チュートリアルに暗号化されたユーザ情報とデジタル署名が含まれている情報を参照することができ、最も重要なのは、有効期限があり、顧客終了を受け取った後、このトークンの後で、各アクセスインタフェースヘッダあり、サーバー認証が成功した表現は、ログイン新規取得が可能前に期限が切れています。

トークンは、特定のコンテンツヘッダ(暗号化情報)、キャリア(ユーザ情報)、署名(署名2つの前の部分)を含んで3つの大きな三個のブロック間の期間(すなわち、「」)一緒に接続すると、完全なトークン情報を形成

プロセス設計

以前の理論的知識によると、私たちは、JWTを使用する方法を設計する必要があります。まず、我々はJWTを使用し、あなたは、もはやセッションとクッキーを使用することはできませんので、最初のステップは次のとおりです。

  1. セキュリティプロファイルステートレスでセッションを設定します。

次いで、三つの部分があり、JWTメッセージボディの構築を検討し、最初の部分は、ヘッダ、コンテンツの暗号化の種類があります。

ファイル

コード上に、ALGプロパティは、署名アルゴリズム(アルゴリズム)、(HS256書かれた)デフォルトHMAC SHA256を表し、標準属性は、トークン(トークン)の種類(タイプ)を示すが、JWTトークンJWTとして書き込ま統一、最終的には、上記JSONオブジェクトBase64URLアルゴリズムは、最初の部分として、使用して文字列に翻訳します。だから、第二段階は、次のとおりです。

  1. セキュリティプロファイルステートレスでセッションを設定します。
  2. ヘッダ情報のフォーマットを決定します

次のステップは、必要とされる実際のデータ転送を格納するために使用されるJSONオブジェクトである第二の部分、メッセージのキャリア(ペイロード)を、決定します。JWTは、選択のための7つの公式の場を提供します:

ファイル

もちろん、これらの他にも、ユーザ情報として、その他のコンテンツを追加することができ、アルゴリズムBase64URL JSONオブジェクトは、文字列、第三の工程と第4工程を回すために使用されています。

  1. セキュリティプロファイルステートレスでセッションを設定します。
  2. ヘッダ情報のフォーマットを決定します
  3. メッセージ本文の決定
  4. メッセージヘッダと第3の本体部として署名を使用してHMACのSHA256アルゴリズム

今トークン基本的にメッセージの組み合わせは、ユーザが記録され、クライアントアクセスインターフェースは、トークン内部認可の名前をヘッダを配置する必要があり、完全です。だから、最後のステップは、正当性トークンを検証し、非正規のログイン・インタフェースのクライアントアクセスであるので、次のように全体の設計プロセスは、次のとおりです。

  1. セキュリティプロファイルステートレスでセッションを設定します。
  2. ヘッダ情報のフォーマットを決定します
  3. メッセージ本文の決定
  4. メッセージヘッダと第3の本体部として署名を使用してHMACのSHA256アルゴリズム
  5. フィルタを追加し、トークンの正当性を検証します

コンフィギュレーション・クラスを変更

上記のプロセスの設計が完了し、我々は最初のセキュリティの設定クラスを変更するには、次の手順に従ってプロジェクトを変更します。

ファイル

設定後、プロジェクト、アクセスログインを開始し、ログインが成功すると、あなたは、任意のクッキーを保存しない、見ることができます。

JWT定義されたツール

まずは、いくつかの定数を定義してみましょう:

ファイル

Base64URLアルゴリズムは、符号化および復号化メソッドを定義します。

ファイル

次いでHMACSHA256暗号化アルゴリズムを定義し、メソッドのシグネチャを得ます。

ファイル

簡単な認証トークンを設計する最後の方法は次のとおりです。

ファイル

うまく設計するようなJWTツールは、これらのメソッドは、現在のトークン十分なコンテンツを操作します。

JWTメッセージオブジェクトの定義

のは、実際には、非常に単純な、三部は、したがって、三つのフィールドで定義することができ、コンテンツのJWTを定義してみましょう:

ファイル

コンストラクタを見て、

ファイル

この工法は、オブジェクトを作成するために後で使用することは非常に便利であり、基本的に完了したJWTの三つの部分、ヘッダ部とペイロード部はまた、完成した署名を符号化されているので、次のトークンは、直接toStringメソッドを書き換える生成することができます。

ファイル

ここからわかるように、トークン全体のデフォルトでは暗号化されていませんが、また、暗号化することができます。オリジナルのトークンを生成した後、それは一度キーで再暗号化することができます。だから、トークンにパスワードやその他の重要な情報を入れないでください。

ログインが成功したプロセッサであり、変更

成功したユーザーがログインした後、セッションはユーザーに配布されることはありませんが、ユーザーのJWTに送信するので、ログインを修正し、次のように成功したプロセッサです。

ファイル

ユーザーのパスワード情報上記の注意マニュアルはnullに設定されています。便宜上、オブジェクトの組み合わせは、直接fastjson。

変更エンティティクラス

インタフェースにアクセスする際にトークンを使用すると、エンティティ・クラスの役割を見て、トークンバックユーザオブジェクトにログインするには、そのための帯域における当社のエンティティクラスとトークンユーザーの同じフィールド名がそれを変更する必要があります。

ファイル

ユーザーのエンティティクラスを見てください:

ファイル

私たちは、基本的な原理は、フィールド名および推奨フィールド名で同じ行の親クラスの名前を修正する必要があり、見ることができます。

トークン検証フィルタを書きます

我々はステートレスセッションのセキュリティを変更した後、もはやものの、セッションを転送しませんが、セキュリティフィルタが失敗しなかったので、効果はログインして成功したログイン、アクセスインタフェースが表示さによって引き起こされます。今、私たちは、ロギングプラストークン検証フィルター前、及び検証情報の直後にSecurityContextHolderにトークンを使用します。このような検証はログインがもはや依存しているセッションであるかどうかを判断しないようにログオンするたびにトークン。このフィルタを見てください:

ファイル

このフィルタは非常に簡単であり、GenericFilterBeanクラスを継承し、トークン直接アクセストークンは、空でなく、認証トークンであると判定されて、トークンがユーザ情報ペイロードから除去され、SecurityContextHolderに、トークンの検証が失敗した場合、またはエラーを返す直接トークンの有効期限が切れ。ロジックは簡単です。

最後に、セキュリティクラス、このフィルタは、前面に配置されています。

ファイル

だから、私たちのカスタムJWTプロセスは完了です。郵便配達をテストすることができ、最初のログインです。

ファイル

ログイン後、あなたは、ヘッダー内の情報は、トークン立って表示し、インターフェイスにアクセスするために別のインタフェースにトークンヘッダを使用することができ、あなたは成功したの訪問を見ることができます:

ファイル

利害関係者は、それがプロセスのトレースをデバッグすることができます。

JWTいくつかの機能

  • (1)JWTのデフォルトは暗号化されていませんが、また、暗号化することができます。オリジナルのトークンを生成した後、それは一度キーで再暗号化することができます。

  • (2)暗号化なしの場合JWTには、秘密データは、JWTを書き込むことができません。

  • (3)JWTだけでなく、認証に使用することができ、また、情報を交換するために使用することができます。JWTの有効活用は、サーバーの数は、データベースを削減することができる照会します。

  • (4)JWT最大の欠点は、サーバがセッション状態を保存していないため、トークンは当然に廃止、またはトークンの権限を変更することができない、ということです。これは、サーバーが追加のロジックを展開する場合を除き、満期日まで有効のままになり、一度JWT発行、です。

  • (5)JWT自体が開示されたときに、誰もがトークンのすべての権限を取得することができ、認証情報が含まれています。盗難を減らすために、JWTの妥当性が比較的短く設定する必要があります。より重要な権利のいくつかのために、再び使用中のユーザを認証する必要があります。

  • (6)不正を低減するために、HTTPプロトコルを使用してJWTコードは、HTTPSプロトコルを使用するように、送信されるべきではありません。

コード住所:https://gitee.com/blueses/spring-boot-security 14

おすすめ

転載: www.cnblogs.com/guos/p/11622273.html