セキュリティ

シングルサインオン

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 を取得できます。例:

MyConfiguration.java
@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" は、周囲のアプリと同じトークンを受け入れるリソースサーバーです)。

MyController.java
@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 が実行する場所であればどこでもトークンリレーを実行する必要があります。