スプリングセキュリティと角度におけるJWT認証


このブログ記事では、Springセキュリティ、スプリングブート、スプリングデータ、アングルを使用したJSON Webトークン認証について説明します.ソースコードをGithub repository
イメージバイMasterTux からPixabay

導入


JSONウェブトークン( JWT )はオープンスタンダード(RFC 7519 ) これは、JSONオブジェクトとしてのパーティー間の情報を安全に送信するためのコンパクトで自己完結型の方法を定義します.それはデジタル署名されているので、この情報を確認し、信頼できる.JWTSはRSAまたはECDSAを使用して秘密(HMACアルゴリズムで)または公開/秘密キーペアを使用して署名することができます.

トークン構造


コンパクトな形式では、JSONウェブトークンはドットで区切られた3つの部分から成ります. ), では、
  • ヘッダー
  • ペイロード
  • 署名
  • したがって、JWTは典型的には以下のようになる.xxxxx.yyyyy.zzzzz

    ヘッダー


    ヘッダーは、2つの部分から成ります:JWTであるトークンのタイプとHMAC SHA 256またはRSAのような使用されている署名アルゴリズム.
    例えば、
    {  
      "alg": "HS256",  
      "typ": "JWT"  
    }
    
    次に、このJSONはJWTの最初の部分を形成するためにBase 64 URL符号化されます.

    ペイロード


    トークンの2番目の部分はペイロードです.クレームはエンティティ(典型的にはユーザ)と追加データに関するステートメントです.特許請求の3つのタイプがあります.登録、公開、および私的請求.

    署名


    シグネチャ部分を作成するには、エンコードされたヘッダー、エンコードされたペイロード、秘密、ヘッダーで指定されたアルゴリズム、および記号を取る必要があります.お読みくださいhttps://jwt.io/introduction/ 詳細なワークフローと説明

    技術

  • ブート2.2 .X
  • 治安
  • バネデータJPA
  • Java JWT library
  • 組み込みデータベース
  • 実装


    多くのオープンソースのJWT実装が利用可能ですall languages . このブログの投稿では、Javaを使用しますjjwt このブログ記事の図書館.
    POMXML
  • 上記のように、春のブート、セキュリティ依存性、および依存関係を追加して空のスプリングブートプロジェクトを作成します
  • ユーザー名とパスワードパラメータを受け入れて、UsernamePasswordAuthenticationTokenクラスを通してユーザーを認証するUserControllerクラスをつくってください
  • @PostMapping(value = {**"/authenticate"**,**"/login"**})  
    **public** Object loginUser(@RequestParam String username, @RequestParam String password)  
    {  
       Authentication authentication=**authenticationManager**.authenticate( **new** UsernamePasswordAuthenticationToken(username, password));  
    
    **return** mapUserAndReturnJwtToken(authentication,**true**);  
    }
    
    4 .プロジェクトの標準的なSpringセキュリティ設定を定義するSecurityConfigクラスを作成します.
    5 .メソッドpublic void configure(HttpSecurity http) 認証がユーザコントローラクラスで手動で行われているので、すべてのリクエストをログインURLに許可します
    セキュリティ設定.ジャバ
    6 .JwtUtil クラスはトークンを発行し、検証する責任があります.特にcreateToken() メソッドは、プロパティファイルからカスタムキーを使用して24時間有効期限と符号付きトークンを作成します
    JWTTtilジャバ
    7.validateToken() 指定したトークンの有効期限を検証する
    8 . JWtrequestFilterフィルタを作成し、クライアントからのすべてのリクエストを傍受し、ベアラートークンを探します.トークンが存在する場合は、ユーザー名を抽出し、有効期限を検証します.
    トークンが有効な場合は、新しいUserNamePasswordAuthenticationTokenを作成し、ユーザーの詳細とユーザーの詳細設定を設定します.Spring Security Authenticationオブジェクトとしてこれを保存してください.そして、それはこのユーザーが認証されて、セキュリティチェーンで続くというSpring Securityに話します.
    10 .このフィルタが動作するためには、SecurityConfigでそれを追加します.
    http.addFilterBefore(**jwtRequestFilter**,UsernamePasswordAuthenticationFilter.**class**);
    
    11デモを表示するには、2ページの角度プロジェクトを生成します.ログインとホームページ

    テスト

  • h 2メモリデータベースをデータベースとして用いた.And schema.sql src/main/resourcesディレクトリのファイルが必要なテーブルを作成します.data.sql サンプル挿入ユーザーとロール
  • アプリケーションを起動するには、Spring BootクラスJWtSpringSecurityApplicationを実行します
  • 今すぐ行くhttp://localhost:8080/h2-console データベースを表示し、資格情報を入力するには、次の手順に従います
  • メモリデータベースにおけるH 2
    問合せで既存のユーザをチェックするSELECT * FROM CORE_USER. 結果が表示されない場合は、SQL文をdata.sql src/main/resourcesで実行します.
    5 . Src/webappディレクトリに移動し、すべての依存関係をインストールする
    $ npm install
    
    6 .角度アプリケーションを起動する
    $ npm run start --watch
    
    7 .今すぐhttp://localhost:4200 ログインページにリダイレクトされます
    8 .資格情報管理者admin/adminを入力し、ホームページにリダイレクトされます.
    ホームページでは、最初の負荷の間、前のページ(クッキーとして格納されている)からトークンを使用し、そのトークンをスプリングブートアプリケーション(そのトークンが有効であることを確認するために)を提示することでユーザー情報を取得します
    有効期限付きJWTトークンのネットワークタブを参照してください
    のホームページ

    結論


    コードアップロードGithub 参考のために、ハッピーコーディング: