1.概要

以前の記事では、https://www.baeldung.com/jhipster[JHipsterの基本]、およびそれを使用してhttps://www.baeldung.com/jhipster-microservices[microservices-mased応用]。

このチュートリアルでは、

JHipsterのUser Account and Authorizationサービス

(略してUAA)と、それを使用して本格的なJHispterベースのマイクロサービスアプリケーションを保護する方法について説明します。さらに良いことに、これはすべて1行のコードを書かなくても達成できます。

2. UAAのコア機能

これまでの記事で作成したアプリケーションの重要な機能は、ユーザーアカウントがそれらの不可欠な部分であるということです。単一のアプリケーションがある場合はこれで問題ありませんが、複数のJHipsterで生成されたアプリケーション間でユーザーアカウントを共有したい場合はどうすればよいですかこれがJHipsterのUAAが登場するところです。

JHipsterのUAAは、私たちのアプリケーションの他のサービスから独立して構築、展開、および実行されるマイクロサービスです。それはとして機能します。

  • Spring Bootの実装に基づくOAuth2認証サーバ

  • ユーザーアカウントのCRUD APIを公開するIdentity Management Server

JHipster UAAは自己登録や「私を覚えている」といった典型的なログイン機能もサポートしています。そしてもちろん、それは他のJHipsterサービスと完全に統合されています。

3.開発環境の設定

開発を始める前に、まず自分の環境にその前提条件がすべて設定されていることを確認する必要があります。

はじめにJHipsterの記事

に記載されているすべてのツールに加えて、実行中のJHipster Registryが必要です。簡単に要約すると、レジストリサービスでは、作成したさまざまなサービスを検索して互いに対話することができます。

レジストリを生成して実行するための完全な手順は、https://www.baeldung.com/jhipster-microservices[Microservice ArchitectureによるJHipsterの記事]のセクション4.1に記載されています。

Dockerイメージも入手可能

であり、代わりに使用することもできます。

4.新しいJHipster UAAサービスの生成

JHipsterコマンドラインユーティリティを使用してUAAサービスを生成しましょう。

$ mkdir uaa
$ cd uaa
$ jhipster

私たちが答えなければならない最初の質問は、どのタイプのアプリケーションを生成したいのかということです。矢印キーを使用して、「JHipster UAA(マイクロサービスOAuth 2認証用)」オプションを選択します。

次に、アプリケーション名、サーバーポート、サービス検出など、生成されたサービスに関する具体的な詳細について、いくつか質問があります。

ほとんどの場合、デフォルトの答えは問題ありません。アプリケーションのベース名、

は生成されるアーティファクトの多くに影響します

については、賢明な名前である

“ uaa”

(小文字)を選択しました。必要に応じて他の値を試すことができますが、生成されたプロジェクトの主な機能は変わりません。

これらの質問に答えた後、JHipsterはすべてのプロジェクトファイルを作成し、

npm

パッケージの依存関係をインストールします(これらは実際には使われていません)。

これで、ローカルのMavenスクリプトを使用して、UAAサービスを構築して実行できます。

$ ./mvnw
... build messages omitted
2018-10-14 14:07:17.995  INFO 18052 ---[ restartedMain]com.baeldung.jhipster.uaa.UaaApp         :
----------------------------------------------------------
        Application 'uaa' is running! Access URLs:
        Local:          http://localhost:9999/        External:       http://192.168.99.1:9999/        Profile(s):    [dev, swagger]----------------------------------------------------------
2018-10-14 14:07:18.000  INFO 18052 ---[ restartedMain]com.baeldung.jhipster.uaa.UaaApp         :
----------------------------------------------------------
        Config Server:  Connected to the JHipster Registry config server!
----------------------------------------------------------

  • ここで注意を払うべき重要なメッセージは、UAAがJHipster Registryに接続されていることを示すものです** このメッセージは、UAAがそれ自体を登録することができ、他のマイクロサービスやゲートウェイによる発見に利用できることを示します。

5. UAAサービスのテスト

生成されたUAAサービスにはそれ自体UIがないため、直接API呼び出しを使用して、期待どおりに機能しているかどうかをテストする必要があります。

私たちが他の部分や私たちのシステムでそれを使う前に私たちが確かめなければならない2つの機能性があります:** OAuth2トークン生成とアカウント検索。

まず、** 簡単な

curl

コマンドを使用して、UAAのOAuthエンドポイントから新しいトークンを取得します。

$ curl -X POST --data \
 "username=user&password=user&grant__type=password&scope=openid" \
 http://web__app:[email protected]:9999/oauth/token

ここでは、2組の認証情報を使用して、

__ password grant

__flowを使用しました。このようなフローでは、基本的なHTTP認証を使用してクライアントの資格情報を送信します。これはURLに直接エンコードされています。

エンドユーザーの資格情報は、標準のユーザー名とパスワードのパラメーターを使用して本文の一部として送信されます。テストプロファイルでデフォルトで使用可能な

“user”

という名前のユーザーアカウントも使用しています。

すべての詳細を正しく入力したとすると、アクセストークンと更新トークンを含む回答が表示されます。

{
  "access__token" : "eyJh...(token omitted)",
  "token__type" : "bearer",
  "refresh__token" : "eyJ...(token omitted)",
  "expires__in" : 299,
  "scope" : "openid",
  "iat" : 1539650162,
  "jti" : "8066ab12-6e5e-4330-82d5-f51df16cd70f"
}

UAAサービスで利用可能な

account

リソース** を使用して、関連付けられたアカウントの情報を取得するために、返された

access

token__を使用できます。

$ curl -H "Authorization: Bearer eyJh...(access token omitted)" \
 http://localhost:9999/api/account
{
  "id" : 4,
  "login" : "user",
  "firstName" : "User",
  "lastName" : "User",
  "email" : "[email protected]",
  "imageUrl" : "",
  "activated" : true,
  "langKey" : "en",
  "createdBy" : "system",
  "createdDate" : "2018-10-14T17:07:01.336Z",
  "lastModifiedBy" : "system",
  "lastModifiedDate" : null,
  "authorities" :["ROLE__USER"]}

  • アクセストークンが期限切れになる前にこのコマンドを発行しなければならないことに注意してください。デフォルトでは、UAAサービスは5分間有効なトークンを発行します。これは実稼働に適した値です。

アプリケーションを実行しているプロファイルに対応する

application- <profile> .yml

ファイルを編集し、

uaa.web-client-configuration.access-token-validity-in-を設定することで、有効なトークンの寿命を簡単に変更できます。 seconds

キー

設定ファイルは、UAAプロジェクトの

src/main/resources/config

ディレクトリにあります。

6. UAA対応ゲートウェイの生成

UAAサービスとサービスレジストリが機能していると確信したので、これらが対話するためのエコシステムを作成しましょう。最後に、私たちは追加しました:

  • Angularベースのフロントエンド

  • マイクロサービスバックエンド

  • これらの両方に立ち向かうAPIゲートウェイ

認証のためにUAAと交渉するサービスになるので、実際にゲートウェイから始めましょう。フロントエンドアプリケーションをホストし、APIリクエストを他のマイクロサービスにルーティングします。

もう一度、新しく作成したディレクトリ内でJHipsterコマンドラインツールを使用します。

$ mkdir gateway
$ cd gateway
$ jhipster

以前と同様に、プロジェクトを生成するためにいくつかの質問に答えなければなりません。重要なものは次のとおりです。


  • アプリケーションタイプ

    :

    は「Microservices gateway」である必要があります


  • アプリケーション名:

    今回は「ゲートウェイ」を使用します


  • サービス検出

    :“ JHipsterレジストリ”を選択


  • 認証タイプ:

    ** 「認証方法」を選択する必要があります。

JHipster UAAサーバー」オプション

こちら


UI Framework:

「Angular 6」を選びましょう

JHipsterがすべてのアーティファクトを生成したら、提供されているMavenラッパースクリプトを使用してゲートウェイを構築および実行できます。

$ ./mwnw
... many messages omitted
----------------------------------------------------------
        Application 'gateway' is running! Access URLs:
        Local:          http://localhost:8080/        External:       http://192.168.99.1:8080/        Profile(s):    [dev, swagger]----------------------------------------------------------
2018-10-15 23:46:43.011  INFO 21668 ---[ restartedMain]c.baeldung.jhipster.gateway.GatewayApp   :
----------------------------------------------------------
        Config Server:  Connected to the JHipster Registry config server!
----------------------------------------------------------

上記のメッセージで、ブラウザに__http://localhost:8080を指定することでアプリケーションにアクセスできます。これにより、デフォルトの生成済みホームページが表示されます。

それでは、[アカウント]>[ログイン]メニュー項目に移動して、アプリケーションにログインしましょう。 JHipsterがデフォルトで自動的に作成する

__admin/admin

__as認証情報を使用します。うまくいって、ウェルカムページは成功したログオンを確認するメッセージを表示するでしょう:

何が起こったのかをおさらいしましょう。まず、ゲートウェイがUAAのOAuth2トークンエンドポイントに認証情報を送信し、認証してアクセスと更新JWTトークンを含む応答を生成しました。ゲートウェイはそれらのトークンを受け取り、クッキーとしてブラウザに送り返しました。

次に、Angularフロントエンドは

/uaa/api/account

APIを呼び出しました。これもゲートウェイがUAAに転送したものです。このプロセスでは、ゲートウェイはアクセストークンを含むCookieを受け取り、その値を使用して要求に認証ヘッダーを追加します。

必要に応じて、UAAとGatewayの両方のログをチェックすることで、この流れすべてを詳細に見ることができます。

org.apache.http.wire

ロガーレベルをDEBUGに設定することで、完全なワイヤレベルのデータを取得することもできます。

7. UAA対応のマイクロサービスを生成する

アプリケーション環境が稼働しているので、今度はそれに単純なマイクロサービスを追加します。 「見積もり」マイクロサービスを作成します。これにより、一連の株価の作成、クエリ、変更、削除を可能にする完全なREST APIが公開されます。各見積りには3つのプロパティしかありません。

  • 見積の取引シンボル

  • その価格

  • 最後の取引のタイムスタンプ

ターミナルに戻り、JHipsterのコマンドラインツールを使用してプロジェクトを生成しましょう。

$ mkdir quotes
$ cd quotes
$ jhipster

今回は、JHipsterに

Microserviceアプリケーション

を生成するよう依頼します。これを「見積もり」と呼びます。質問は以前に答えたものと似ています。これらの3つを除いて、私たちはそれらのほとんどのためにデフォルトを保つことができます:


  • サービスの発見:

    既に「JHipster Registry」を選択しています

私たちの建築でそれを使う
**

UAAアプリケーションへのパス:

すべてのプロジェクトを保持しているので

同じフォルダの下のディレクトリ、これは

../uaa

になります(
それを変えた、もちろん)
**

認証タイプ:

「JHipster UAAサーバー」を選択

これが私たちの場合の典型的な答えのシーケンスです。

JHipsterがプロジェクトの生成を終えたら、先に進んでそれを構築することができます。

$ mvnw
... many, many messages omitted
----------------------------------------------------------
        Application 'quotes' is running! Access URLs:
        Local:          http://localhost:8081/        External:       http://192.168.99.1:8081/        Profile(s):    [dev, swagger]----------------------------------------------------------
2018-10-19 00:16:05.581  INFO 16092 ---[ restartedMain]com.baeldung.jhipster.quotes.QuotesApp   :
----------------------------------------------------------
        Config Server:  Connected to the JHipster Registry config server!
----------------------------------------------------------
... more messages omitted

「JHipster Registry設定サーバーに接続しました」というメッセージが、ここで探しているものです。その存在は、マイクロサービスが自分自身をレジストリに登録したことを示しています。そのため、ゲートウェイを作成した後、ゲートウェイは要求を私たちの「見積もり」リソースにルーティングして素敵なUIに表示できます。マイクロサービスアーキテクチャを使用しているので、このタスクを2つの部分に分けました。

  • “quotes”リソースバックエンドサービスを作成する

  • フロントエンド(ゲートウェイプロジェクトの一部)に「見積もり」UIを作成します。

7.1. 見積もりリソースの追加

まず、引用符で囲まれたマイクロサービスアプリケーションが確実に停止されるようにする必要があります。以前に実行したのと同じコンソールウィンドウでCTRL-Cを押すことができます。

それでは、JHipsterのツールを使用して

プロジェクトにエンティティを追加しましょう

。今回は

import-jdl

コマンドを使用します。これにより、面倒でエラーが発生しやすいすべての詳細情報を個別に入力する手間が省けます。

JDLフォーマットの詳細については、https://www.jhipster.tech/jdl/[full JDL reference]を参照してください。

次に、

__Quote


entity定義を含む

quotes.jh__というテキストファイルを、いくつかのコード生成ディレクティブとともに作成します。

entity Quote {
  symbol String required unique,
  price BigDecimal required,
  lastTrade ZonedDateTime required
}
dto Quote with mapstruct
paginate Quote with pagination
service Quote with serviceImpl
microservice Quote with quotes
filter Quote
clientRootFolder Quote with quotes

これで、このエンティティ定義をプロジェクトにインポートできます。

$ jhipster import-jdl quotes.jh

  • 注:インポート中に、Jmipsterは

    master.xml

    ファイルに変更を適用している間、競合について不平を言います。この場合は

    overwrite

    オプションを安全に選択できます。


__mvnwを使用して、マイクロサービスを再構築して実行することができます。これで、ゲートウェイが[管理]メニューからアクセスできる[ゲートウェイ]ビューにアクセスする新しいルートを選択したことを確認できます。今回は、

“/quotes/


” __ルートのエントリがあることがわかります。これは、バックエンドがUIで使用できるようになったことを示しています。

7.2. 見積もりUIを追加する

最後に、見積もりにアクセスするために使用するゲートウェイプロジェクトでCRUD UIを生成しましょう。 UIコンポーネントを生成するために、 “quotes”マイクロサービスプロジェクトの同じJDLファイルを使用します。そして、JHipsterの

import-jdl

コマンドを使用してインポートします。

$ jhipster import-jdl ../jhipster-quotes/quotes.jh
...messages omitted
? Overwrite webpack\webpack.dev.js? <b>y</b>
... messages omitted
Congratulations, JHipster execution is complete!

インポート中に、JHipsterは競合するファイルに関して取るべきアクションを数回促します。今回の場合、カスタマイズは行っていないので、既存のリソースを単純に上書きすることができます。

これでゲートウェイを再起動して、達成したことを確認できます。ブラウザでhttp://localhost:8080[


http://localhost:8080


]のゲートウェイにアクセスし、その内容を更新します。

Entities

メニューに

Quotes

リソースの新しいエントリが追加されました。

このメニューオプションをクリックすると、

Quotes

リスト画面が表示されます。

予想通り、リストは空です – まだ引用符を追加していません

この画面の右上にある[新規見積の作成]ボタンをクリックして作成してください。作成/編集フォームに移動します。

生成されたフォームには期待されるすべての機能があることがわかります。

  • 必須項目は赤く表示されています。

いっぱいになった
** 日付/時刻と数値フィールドはネイティブコンポーネントを使用してデータを扱います。

エントリ
** データを変更せずに保存することも、保存することもできます。

私たちの新しいまたは変更されたエンティティ

このフォームに入力して[保存]をクリックすると、リスティング画面に結果が表示されます。データグリッドに新しい

Quotes

instance____が表示されます。

  • 管理者として、標準のSwagger API開発者ポータルにアクセスするためのAPIメニュー項目** にもアクセスできます。この画面では、利用可能なAPIの1つを選択して実行できます。


  • __default:利用可能なルートを表示する

    __Gateway独自のAPI


  • uaa

    :アカウントとユーザーのAPI


  • __quotes:

    __Quotes API

8.次のステップ

これまでに構築したアプリケーションは期待通りに機能し、さらなる開発のための強固な基盤を提供します。要件の複雑さに応じて、最も確実にカスタムコードを作成する必要もあります。いくつかの作業が必要になる可能性があるいくつかの分野は次のとおりです。


  • UIのルックアンドフィールのカスタマイズ:

    これは通常非常に簡単です。

フロントエンドアプリケーションの構成方法 – 私たちは長い道のりを進むことができます
単純にCSSをいじることといくつかの画像を追加することによって
**

ユーザーリポジトリの変更:

一部の組織ではすでに何らかの種類のものがあります

内部ユーザーリポジトリ(LDAPディレクトリなど)の場合 – これには、
UAAは変更されましたが、いいところは変更するだけでよい
一回


エンティティに対するファイングレイン認可:


標準的なセキュリティ

生成されたエンティティバックエンドで使用されるモデルには、インスタンスレベルやフィールドレベルのセキュリティはありません** – 適切なレベルで制限を追加するのは開発者次第です(場合によってはAPIまたはサービス)。

それでも、JHispterのようなツールを使用すると、新しいアプリケーションを開発するときに非常に役立ちます。それはそれとともに強固な基盤をもたらし、システム(そして開発者)が進化するにつれて、私達のコードベースで良いレベルの一貫性を保つことができます。

9.まとめ

この記事では、JHispterを使用してマイクロサービス・アーキテクチャーとJHipsterのUAAサーバーに基づいて実用的なアプリケーションを作成する方法を説明しました。

私たちは1行のJavaコードを書かずにそれを達成しました

これは非常に印象的です。

いつものように、この記事で紹介されているプロジェクトの完全なコードはhttps://github.com/eugenp/tutorials/tree/master/jhipster/jhipster-uaa[GitHub repository]にあります。