5.10. テナント解決
5.10.1. テナント解決命令 リンクのコピーリンクがクリップボードにコピーされました!
OIDC テナントは次の順序で解決されます。
-
プロアクティブ認証が無効な場合は、最初に
io.quarkus.oidc.Tenant
アノテーションがチェックされます。 -
カスタムの
TenantConfigResolver
を使用した動的なテナント解決。 -
カスタムの
TenantResolver
、設定済みのテナントパス、テナント ID として最後のリクエストパスセグメントをデフォルトに設定する方法のうち、いずれかを使用した静的テナント解決。
上記手順の後にテナント ID が解決されていない場合は、最後にデフォルトの OIDC テナントが選択されます。
詳細は、以下のセクションを参照してください。
さらに、OIDC web-app
アプリケーションの場合、状態 Cookie とセッション Cookie が、認可コードフローの開始時に上記のいずれかの方法を使用して解決されたテナントに関するヒントを提供します。詳細は、OIDC web-app アプリケーションのテナント解決 セクションを参照してください。
5.10.2. アノテーションで解決する リンクのコピーリンクがクリップボードにコピーされました!
io.quarkus.oidc.TenantResolver
を使用する代わりに、io.quarkus.oidc.Tenant
アノテーションを使用してテナント識別子を解決することができます。
これを機能させるには、プロアクティブ HTTP 認証を無効にする必要があります (quarkus.http.auth.proactive=false
)。詳細は、プロアクティブ認証 ガイドを参照してください。
アプリケーションが hr
テナントと default テナントの 2 つの OIDC テナントをサポートしていると仮定すると、@Tenant("hr")
を持つすべてのリソースメソッドとクラスは、quarkus.oidc.hr.auth-server-url
によって設定された OIDC プロバイダーを使用して認証されます。対照的に、他のすべてのクラスとメソッドは、引き続きデフォルトの OIDC プロバイダーを使用して認証されます。
- 1
io.quarkus.oidc.Tenant
アノテーションは、リソースクラスまたはリソースメソッドのいずれかに配置する必要があります。
上記の例では、sayHello
エンドポイントの認証が @Authenticated
アノテーションによって適用されます。
または、HTTP セキュリティーポリシー を使用してエンドポイントを保護する場合に @Tenant
アノテーションを有効にするには、次の例に示すように、このポリシーの権限チェックを遅延する必要があります。
quarkus.http.auth.permission.authenticated.paths=/api/hello quarkus.http.auth.permission.authenticated.methods=GET quarkus.http.auth.permission.authenticated.policy=authenticated quarkus.http.auth.permission.authenticated.applies-to=JAXRS
quarkus.http.auth.permission.authenticated.paths=/api/hello
quarkus.http.auth.permission.authenticated.methods=GET
quarkus.http.auth.permission.authenticated.policy=authenticated
quarkus.http.auth.permission.authenticated.applies-to=JAXRS
- 1
@Tenant
アノテーションを使用してテナントを選択した後、Quarkus に HTTP 権限チェックを実行するように指示します。
5.10.3. 動的なテナント設定の解決 リンクのコピーリンクがクリップボードにコピーされました!
サポートするさまざまなテナントに対してより動的な設定が必要であり、設定ファイルに複数のエントリーを含めたくない場合は、io.quarkus.oidc.TenantConfigResolver
を使用できます。
このインターフェイスを使用すると、実行時にテナント設定を動的に作成できます。
このメソッドによって返される OidcTenantConfig
は、application.properties
. から oidc
namespace 設定を解析するために使用されるものと同じです。quarkus-oidc
エクステンションでサポートされている任意の設定を使用して、これを入力できます。
動的テナントリゾルバーが null
を返す場合は、次に 静的テナント設定の解決 が試行されます。
5.10.4. 静的テナント設定の解決 リンクのコピーリンクがクリップボードにコピーされました!
application.properties
ファイルで複数のテナント設定を設定する場合は、テナント識別子の解決方法を指定するだけで済みます。テナント識別子の解決を設定するには、次のいずれかのオプションを使用します。
これらのテナント解決オプションは、テナント ID が解決されるまで、リストされている順序で試行されます。テナント ID が未解決のまま (null
) の場合は、デフォルト (名前なし) のテナント設定が選択されます。
5.10.4.1. TenantResolver で解決する リンクのコピーリンクがクリップボードにコピーされました!
次の application.properties
の例は、TenantResolver
メソッドを使用して、a
および b
という名前の 2 つのテナントのテナント ID を解決する方法を示しています。
io.quarkus.oidc.TenantResolver
から a
または b
のテナント ID を返すことができます。
この例では、最後のリクエストパスセグメントの値はテナント ID ですが、必要に応じて、より複雑なテナント ID 解決ロジックを実装できます。
5.10.4.2. テナントパスを設定する リンクのコピーリンクがクリップボードにコピーされました!
io.quarkus.oidc.TenantResolver
を使用する代わりに、quarkus.oidc.tenant-paths
設定プロパティーを使用してテナント識別子を解決することができます。前の例で使用した HelloResource
リソースの sayHello
エンドポイントに hr
テナントを選択する方法は次のとおりです。
quarkus.oidc.hr.tenant-paths=/api/hello quarkus.oidc.a.tenant-paths=/api/* quarkus.oidc.b.tenant-paths=/*/hello
quarkus.oidc.hr.tenant-paths=/api/hello
quarkus.oidc.a.tenant-paths=/api/*
quarkus.oidc.b.tenant-paths=/*/hello
パスマッチングメカニズムは、設定を使用した認可 の場合とまったく同じように機能します。
5.10.4.3. 最後のリクエストパスセグメントをテナント ID として使用する リンクのコピーリンクがクリップボードにコピーされました!
テナント識別子のデフォルトの解決は規則に基づいており、認証要求には要求パスの最後のセグメントにテナント識別子が含まれている必要があります。
次の application.properties
の例は、google
と github
という名前の 2 つのテナントを設定する方法を示しています。
上記の例では、両方のテナントが OIDC web-app
アプリケーションを設定して、認可コードフローを使用してユーザーを認証し、認証後にセッション Cookie を生成することを要求します。Google または GitHub が現在のユーザーを認証すると、ユーザーは、JAX-RS エンドポイント上のセキュリティーで保護されたリソースパスなど、認証されたユーザーの /signed-in
領域に戻されます。
最後に、デフォルトのテナント解決を完了するには、次の設定プロパティーを設定します。
quarkus.http.auth.permission.login.paths=/google,/github quarkus.http.auth.permission.login.policy=authenticated
quarkus.http.auth.permission.login.paths=/google,/github
quarkus.http.auth.permission.login.policy=authenticated
エンドポイントが http://localhost:8080
で実行している場合は、特定の /google
または /github
JAX-RS リソースパスを追加せずに、ユーザーが http://localhost:8080/google
または http://localhost:8080/github
にログインするための UI オプションを提供することもできます。認証が完了すると、テナント識別子もセッション Cookie 名に記録されます。したがって、認証されたユーザーは、セキュリティー保護された URL に google
または github
のパス値を含める必要なく、セキュリティー保護されたアプリケーション領域にアクセスできます。
デフォルトの解決は、ベアラートークン認証でも機能します。ただし、テナント識別子は常に最後のパスセグメント値として設定する必要があるため、あまり実用的ではない可能性があります。
5.10.4.4. トークン発行者のクレームでテナントを解決する リンクのコピーリンクがクリップボードにコピーされました!
ベアラートークン認証をサポートする OIDC テナントは、アクセストークンの発行者を使用して解決できます。発行者ベースの解決を機能させるには、次の条件を満たす必要があります。
-
アクセストークンが JWT 形式であり、発行者 (
iss
) トークンクレームを含んでいる必要があります。 -
アプリケーションタイプが
service
またはhybrid
である OIDC テナントのみが考慮されます。これらのテナントでは、トークン発行者が検出または設定されている必要があります。
発行者ベースの解決は、quarkus.oidc.resolve-tenants-with-issuer
プロパティーで有効になります。以下に例を示します。
5.10.5. OIDC web-app アプリケーションのテナント解決 リンクのコピーリンクがクリップボードにコピーされました!
OIDC web-app
アプリケーションのテナント解決は、OIDC テナント固有の設定が次の各ステップの実行方法に影響する場合、認可コードフロー中に少なくとも 3 回実行する必要があります。
ステップ 1: 認証されていないユーザーがエンドポイントにアクセスし、OIDC プロバイダーにリダイレクトされる
認証されていないユーザーが保護されたパスにアクセスすると、ユーザーは認証のために OIDC プロバイダーにリダイレクトされ、テナント設定を使用してリダイレクト URI が構築されます。
静的テナント設定の解決 および 動的テナント設定の解決 セクションにリストされているすべての静的および動的テナント解決オプションを使用して、テナントを解決できます。
ステップ 2: ユーザーがエンドポイントにリダイレクトされる
プロバイダー認証後、ユーザーは Quarkus エンドポイントにリダイレクトされ、認可コードフローを完了するためにテナント設定が使用されます。
静的テナント設定の解決 および 動的テナント設定の解決 セクションにリストされているすべての静的および動的テナント解決オプションを使用して、テナントを解決できます。テナント解決が開始する前に、認可コードフローの state cookie
を使用して、すでに解決されたテナント設定 ID が RoutingContext の tenant-id
属性として設定されます。これは、カスタムの動的 TenantConfigResolver
テナントリゾルバーと静的 TenantResolver
テナントリゾルバーの両方がこれをチェックできます。
ステップ 3: 認証されたユーザーがセッション Cookie を使用して保護されたパスにアクセスする
テナント設定によって、セッション Cookie の検証および更新方法が決定されます。テナント解決が開始する前に、認可コードフローの session cookie
を使用して、すでに解決されたテナント設定 ID が RoutingContext の tenant-id
属性として設定されます。カスタムの動的 TenantConfigResolver
テナントリゾルバーと静的 TenantResolver
テナントリゾルバーの両方がこれをチェックできます。
たとえば、カスタムの TenantConfigResolver
が、すでに解決されているテナント設定の作成を回避する方法は次のとおりです。これを回避しないと、データベースやその他のリモートソースからの読み取りをブロックしなければならない可能性があります。
デフォルトの設定は次のようになります。
quarkus.oidc.auth-server-url=http://localhost:8180/realms/default quarkus.oidc.client-id=client-default quarkus.oidc.credentials.secret=secret-default quarkus.oidc.application-type=web-app
quarkus.oidc.auth-server-url=http://localhost:8180/realms/default
quarkus.oidc.client-id=client-default
quarkus.oidc.credentials.secret=secret-default
quarkus.oidc.application-type=web-app
上記の例では、tenant-a
、tenant-b
、およびデフォルトテナントがすべて同じエンドポイントパスを保護するために使用されていることを前提としています。つまり、ユーザーが tenant-a
設定で認証されると、このユーザーは、ログアウトしてセッション Cookie がクリアされるか期限切れになるまで、tenant-b
またはデフォルト設定で認証することを選択できなくなります。
複数の OIDC web-app
テナントがテナント固有のパスを保護する状況はあまり一般的ではなく、特別な注意が必要です。tenant-a
、tenant-b
、デフォルトテナントなどの複数の OIDC web-app
テナントを使用してテナント固有のパスへのアクセスを制御する場合、1 つの OIDC プロバイダーで認証されたユーザーは、別のプロバイダーによる認証を必要とするパスにアクセスできないようにする必要があります。そうしないと、結果が予測不可能になり、予期しない認証エラーが発生する可能性が高くなります。たとえば、tenant-a
認証に Keycloak 認証が必要で、tenant-b
認証に Auth0 認証が必要な場合、tenant-a
の認証済みユーザーが tenant-b
設定で保護されたパスにアクセスしようとすると、セッション Cookie が検証されません。これは、Auth0 公開検証キーを使用しても、Keycloak によって署名されたトークンを検証できないためです。複数の web-app
テナントが互いに競合するのを回避するには、次の例に示すように、テナント固有のセッションパスを設定するのが簡単であり、推奨されます。
デフォルトのテナント設定を次のように調整する必要があります。
quarkus.oidc.auth-server-url=http://localhost:8180/realms/default quarkus.oidc.client-id=client-default quarkus.oidc.credentials.secret=secret-default quarkus.oidc.authentication.cookie-path=/default quarkus.oidc.application-type=web-app
quarkus.oidc.auth-server-url=http://localhost:8180/realms/default
quarkus.oidc.client-id=client-default
quarkus.oidc.credentials.secret=secret-default
quarkus.oidc.authentication.cookie-path=/default
quarkus.oidc.application-type=web-app
複数の OIDC web-app
テナントがテナント固有のパスを保護するときに、同じセッション Cookie パスを使用することは推奨されません。これは、カスタムリゾルバーからの管理がさらに必要になるため、回避する必要があります。次に例を示します。