現在、マイクロサービスアーキテクチャに基づくアプリケーションを開発しています。 Spring Cloud NetfixのZuulサーバーを使用して実装されたAPIゲートウェイを使用して、リクエストをマイクロサービスにルーティングします。
すべてのサービスでシングルサインオンを実現するために、現在、Spring Cloud Securityを使用してセットアップされたOAuth2サーバーで作業しています。サーバーは基本的にDave Syer's Repoの実装のコピーと過去です: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver
主な違いは、リクエストをZuulプロキシ経由でOAuthサーバーにルーティングすることです。この方法で、OAuthサーバーを直接公開する必要はありません。ログインサーバーを動的に追加および削除できます。
問題は、このセットアップを正しく構成する方法を理解するために継ぎ目がないことです。 OAuthサーバー上の保護されたリソースにアクセスしようとすると、ログインページに転送されます。これは当然のことですが、使用するホスト名とポートの設定方法がわかりません。転送したい場合は、OAuthサーバーにプロキシされるZuulサーバー上のエンドポイントに転送するサーバーです。(Zuul API-Gatewayは唯一のサーバーである必要がありますクライアントはこれまでに会話します。他のすべては隠されます。)
ホストとポートはHttpServletRequest
のLoginUrlAuthenticationEntryPoint
から読み取られるためです。ただし、サーバーに表示されるリクエストは、Zuulプロキシによって送信されたリクエストです。したがって、プロキシのエンドポイントではなく、内部IPに転送されます。
WebSecurityConfigurerAdapter.configure(HttpSecurity)
のログインページのURLをZuulプロキシの絶対URLに設定しようとしました。しかし、これにより、アプリケーションがあまりにも多くのリダイレクトについて文句を言うようになりました。 (ループが発生した可能性があります。)
これを設定する最良の方法は何でしょうか?
Update:POCはここにあります https://github.com/kakawait/uaa-behind-zuul-sample
次の設定を試してみましたか(zuul
サーバーで):
zuul:
routes:
uaa-service:
path: /uaa/**
stripPrefix: false
security:
# Disable Spring Boot basic authentication
basic:
enabled: false
oauth2:
sso:
loginPath: /login
client:
accessTokenUri: https://<zuul hostname>/uaa/oauth/token
userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
...
基本的に私のプロジェクトで動作するのは、/uaa/oauth/token
ルートのCSRF
保護を無効にすることだけです。
認証サーバーがオンになっている必要があります
server:
# Use different context-path to avoid session cookie overlapping
context-path: /uaa
Spring-Cloud.Brixton.M3
を使用してテスト済み
@ thomas-letsch のおかげで、次のようにセキュリティを微調整する必要があります(サンプル)
public void configure(HttpSecurity http) throws Exception {
http.logout().and()
.antMatcher("/**").authorizeRequests()
.antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll()
.anyRequest().authenticated().and()
.csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/oauth/token").and()
.addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class);
}
あなたの質問を理解している限り、spring-cloud-security
(のために EnableOauth2Sso
part)およびspring-cloud
(zuulの場合)、zuulを使用して認証サーバーへの呼び出しをプロキシすることはできません。主な理由はspring-cloud-security
は、Zuulルーティングのロジックを独立して(そして考慮する前に)ゲートウェイを保護します。
つまり、(Dave Syerの OAuth2 の例の構成の例)spring.oauth2.client.*
設定
spring:
oauth2:
client:
accessTokenUri: http://localhost:9999/uaa/oauth/token
userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
clientId: acme
clientSecret: acmesecret
beforeと見なされ、Zuulのルートへのアクセスが許可されますzuul.routes.*
さらに、この設定により、クライアントエージェントは、ゲートウェイ用と認可サーバー用の2つのCookieを保存できます。
これがお役に立てば幸いです。