セキュリティ
シングルサインオン
OAuth2 SSO およびリソースサーバー機能はすべて、バージョン 1.3 の Spring Boot に移行されました。ドキュメントは Spring Boot ユーザーガイドにあります。 |
クライアントトークンリレー
アプリが OAuth2 クライアントに面するユーザー (つまり、@EnableOAuth2Sso
または @EnableOAuth2Client
を宣言している) である場合、そのアプリは Spring Boot からのリクエストスコープに OAuth2ClientContext
を持ちます。このコンテキストとオートワイヤーされた OAuth2ProtectedResourceDetails
から独自の OAuth2RestTemplate
を作成すると、コンテキストは常にアクセストークンをダウンストリームに転送し、有効期限が切れた場合はアクセストークンを自動的にリフレッシュします。(Spring Security、Spring Boot の特長です。)
リソースサーバートークンリレー
アプリに @EnableResourceServer
がある場合は、受信トークンをダウンストリームで他のサービスに中継することをお勧めします。RestTemplate
を使用してダウンストリームサービスに接続する場合、これは適切なコンテキストを使用してテンプレートを作成する方法だけの問題です。
サービスが受信トークンの認証に UserInfoTokenServices
を使用している場合 (つまり、security.oauth2.user-info-uri
構成を使用している場合)、オートワイヤーされた OAuth2ClientContext
を使用して OAuth2RestTemplate
を簡単に作成できます (バックエンドコードに到達する前に認証プロセスによって設定されます)。同様に (Spring Boot 1.4 を使用する場合)、UserInfoRestTemplateFactory
を挿入し、構成内でその OAuth2RestTemplate
を取得できます。例:
@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}
この Rest テンプレートには、認証フィルターで使用されるものと同じ OAuth2ClientContext
(リクエストスコープ) が含まれるため、それを使用して同じアクセストークンでリクエストを送信できます。
アプリが UserInfoTokenServices
を使用していなくてもクライアントである場合 (つまり、@EnableOAuth2Client
または @EnableOAuth2Sso
を宣言している場合)、Spring Security Cloud では、ユーザーが @Autowired
OAuth2Context
から作成した OAuth2RestOperations
もトークンを転送します。この機能はデフォルトで MVC ハンドラーインターセプターとして実装されるため、Spring MVC でのみ動作します。MVC を使用していない場合は、AccessTokenContextRelay
をラップするカスタムフィルターまたは AOP インターセプターを使用して、同じ機能を提供できます。
以下は、他の場所で作成されたオートワイヤーされた REST テンプレートの使用を示す基本的な例です ("foo.com" は、周囲のアプリと同じトークンを受け入れるリソースサーバーです)。
@Autowired
private OAuth2RestOperations restTemplate;
@RequestMapping("/relay")
public String relay() {
ResponseEntity<String> response =
restTemplate.getForEntity("https://foo.com/bar", String.class);
return "Success! (" + response.getBody() + ")";
}
トークンを転送したくない場合 (トークンを送信したクライアントではなく、自分自身として動作する可能性があるため、これは有効な選択です)、必要なのは、デフォルトのもの。
偽のクライアントは、OAuth2ClientContext
が利用可能な場合はそれを使用するインターセプターも選択するため、RestTemplate
が実行する場所であればどこでもトークンリレーを実行する必要があります。