Spring Cloudセキュリティ入門

1概要

Spring Cloud Securityモジュールは、Spring Bootアプリケーションにおけるトークンベースのセキュリティに関連する機能を提供します。

具体的には、OAuth2ベースのSSOをより簡単にします。リソースサーバー間でのトークンのリレーのサポート、および組み込みZuulプロキシを使用したダウンストリーム認証の構成が可能です。

このクイック記事では、Spring Bootクライアントアプリケーション、Authorization Server、およびリソースサーバーとして機能するREST APIを使用してこれらの機能を設定する方法について説明します。

この例では、SSOを使用してクラウドセキュリティ機能を実証するクライアントアプリケーションは1つだけですが、通常のシナリオでは、シングルサインオンの必要性を正当化するために少なくとも2つのクライアントアプリケーションがあります。

2クラウドセキュリティアプリケーションのクイックスタート

Spring BootアプリケーションでSSOを設定することから始めましょう。

まず、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-cloud-starter-oauth2%22[ spring-cloud-starter-oauth2 ]依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
    <version>1.2.2.RELEASE</version>
</dependency>

これは spring-cloud-starter-security 依存関係も持ち込みます。

__http://localhost:7070/authserverにローカルにデプロイされています。

私たちの認可サーバーはJWTトークンを使います。

さらに、どのクライアントでもユーザーの資格情報を取得できるようにするには、ポート9000で実行されているリソースサーバーを、これらの資格情報を提供できるエンドポイントで構成する必要があります。

ここでは、 http://localhost:9000/userにある/ user__エンドポイントを設定しました。

Authorization ServerとResource Serverの設定方法の詳細については、/rest-api-spring-oauth2-angularjs[前の記事]を参照してください。

@Configuration
@EnableOAuth2Sso
public class SiteSecurityConfigurer
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       //...
    }
}
  • 認証が必要なリクエストは承認サーバーにリダイレクトされます** これを機能させるには、サーバーのプロパティも定義する必要があります。

security:
  oauth2:
    client:
      accessTokenUri: http://localhost:7070/authserver/oauth/token
      userAuthorizationUri: http://localhost:7070/authserver/oauth/authorize
      clientId: authserver
      clientSecret: passwordforauthserver
    resource:
      userInfoUri: http://localhost:9000/user

上記の設定がうまくいくためには、クラスパスに__ spring-boot-starter-securityが必要です。

3アクセストークンの中継

トークンをリレーしている間、OAuth2クライアントはそれによって受信されたOAuth2トークンを発信リソース要求に転送します。

@ EnableOauth2Sso アノテーションを宣言したので、Spring Bootはリクエストスコープに OAuth2ClientContext Beanを追加します。これに基づいて、クライアントアプリケーションで独自の OAuth2RestTemplate を作成できます。

@Bean
public OAuth2RestOperations restOperations(
  OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) {
    return new OAuth2RestTemplate(resource, context);
}

Beanを設定すると、コンテキストはアクセストークンを要求されたサービスに転送し、期限切れになった場合もトークンを更新します。

4 RestTemplate を使用したOAuthトークンの中継

クライアントアプリケーションで、以前は OAuth2RestTemplate 型の restOperations Beanを定義しました。その結果、 クライアントから保護されたリソースサーバーに 必要なトークンを含むリクエストを送信するために OAuth2RestTemplate getForObject() メソッドを使用できます。

まず、リソースサーバーで認証を必要とするエンドポイントを定義しましょう。

@GetMapping("/person")
@PreAuthorize("hasAnyRole('ADMIN', 'USER')")
public @ResponseBody Person personInfo(){
    return new Person("abir", "Dhaka", "Bangladesh", 29, "Male");
 }

これは、 Person オブジェクトのJSON表現を返す単純なRESTエンドポイントです。

これで、** トークンをリソースサーバーに中継する getForObject() メソッドを使用して、クライアントアプリケーションから要求を送信できます。

@Autowired
private RestOperations restOperations;

@GetMapping("/personInfo")
public ModelAndView person() {
    ModelAndView mav = new ModelAndView("personinfo");
    String personResourceUrl = "http://localhost:9000/person";
    mav.addObject("person",
      restOperations.getForObject(personResourceUrl, String.class));

    return mav;
}

5トークンリレー用のZuulの設定

トークンを下流のプロキシサービスに中継したい場合は、Spring Cloud Zuul Embedded Reverse Proxyを使用できます。

まず、Zuulを操作するためのMaven依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

次に、Clientアプリケーションの構成クラスに@ EnableZuulProxy アノテーションを追加する必要があります。

@Configuration
@EnableOAuth2Sso
@EnableZuulProxy
public class SiteSecurityConfigurer
  extends WebSecurityConfigurerAdapter {
   //...
}

あとは、Zuul設定プロパティを application.yml ファイルに追加するだけです。

zuul:
  routes:
    resource:
      path:/api/** **
      url: http://localhost:9000
    user:
      path:/user/** **
      url: http://localhost:9000/user

クライアントアプリケーションの/ api エンドポイントに送信された要求はすべて、リソースサーバーのURLにリダイレクトされます。また、ユーザー認証情報エンドポイントのURLを提供する必要があります。

6. 結論

この簡単な記事では、OAuth2とZuulでSpring Cloud Securityを使用して、安全な認証サーバーとリソースサーバーを構成する方法、および Oauth2RestTemplate とEmbedded Zuul Proxyを使用してサーバー間でOAuth2トークンを中継する方法を調べました。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-security[GitHubで利用可能]です。

前の投稿:javax.measureの紹介
次の投稿:Java String.intern()