OAuth2 - @EnableResourceServerと@ EnableOAuth2Sso

1.概要

このチュートリアルでは、Spring Securityの @ EnableResourceServer アノテーションと @ EnableOAuth2Sso アノテーションについて説明します。

OAuth2 Client とOAuth2 Resource Server ** の違いについて説明することから始めます。その後、これらのアノテーションが私たちのために何をすることができるかについて少し話し、https://cloud.spring.io/spring-cloud-netflix/multi/multi router and filter zuul.html[ Zuul ]とaを使った例でそれらの使い方を実演しますシンプルなAPI

この記事の目的のために、 Zuul OAuth2 に関する既存の経験を前提とします。

あなたが何も持っていないか、どちらかのレビューが参考になるだろうと感じているならば、私たちのhttps://www.baeldung.com/spring-rest-with-zuul-proxy OAuth2 へのガイド]。

2. OAuth2クライアントとリソースサーバー

私達が考慮する必要があるOAuth2の中の4つの異なるhttps://tools.ietf.org/html/rfc6749#page-6[ roles ]があります:

  • Resource Owner - 自身へのアクセスを許可できるエンティティ

保護されたリソース Authorization Server ** - アクセストークンを Clients に付与します。

Resource Owners の認証に成功し、 彼らの承認 Resource Server ** - アクセストークンが必要なコンポーネント

そのリソースへのアクセスを許可、または少なくとも考慮します。 Client ** - からアクセストークンを取得できるエンティティ

認証サーバー

@ EnableResourceServer または @ EnableOAuth2Sso を使用して構成クラスに注釈を付けると、Springはアプリケーションを上記の後者の2つの役割のいずれかに変換するコンポーネントを構成するように指示されます。

逆に、 @ EnableOAuth2Sso アノテーションはアプリケーションをOAuth2クライアントに変換します。 OAuth2ClientAuthenticationProcessingFilter という他のコンポーネントをSpringに設定するように指示します。認可サーバーからアクセストークンを取得できる必要があります。

https://github.com/spring-projects/spring-security-oauth2-boot/blob/master/spring-security-oauth2-autoconfigure/src/main/java/org/springframework/boot/autoconfigureを見てください。 Springが私たちに何を設定するかについての詳細は/security/oauth2/client/SsoSecurityConfigurer.java[ SsoSecurityConfigurer ]クラスを参照してください。

これらのアノテーションをいくつかのプロパティと組み合わせることで、物事を素早く立ち上げることができます。 2つの異なるアプリケーションを作成して、それらが実際に動作していること、そしてそれらがどのように互いに補完できるかを見てみましょう。

  • 私たちの最初のアプリケーションは私たちのエッジノード、単純な Zuul になるでしょう。

@ EnableOAuth2Sso アノテーションを使用しようとしているアプリケーション。それは ユーザーの認証に責任を負うことになります。 Authorization (サーバー )および他の人に着信要求を委任する アプリケーション ** 2番目のアプリケーションは @ EnableResourceServer__を使用します。

アノテーションを取得し、着信リクエストに有効なOAuth2アクセストークンが含まれている場合、保護されたリソースへのアクセスを許可します。

3. Zuul - @ EnableOAuth2Sso

まず、エッジノードとして機能し、OAuth2 Authorization Server を使用してユーザーを認証する責任を負う Zuul アプリケーションを作成します。

@Configuration
@EnableZuulProxy
@EnableOAuth2Sso
@Order(value = 0)
public class AppConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private ResourceServerTokenServices
      resourceServerTokenServices;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/authorization-server-1/** ** ",
              "/login").permitAll()
            .anyRequest().authenticated().and()
            .logout().permitAll().logoutSuccessUrl("/");
    }
}

Zuul アプリケーションに @ EnableOAuth2Sso という注釈を付けると、Springに httpsを設定するよう通知されます。 springframework/クラウド/セキュリティ/oauth2/proxy/OAuth2TokenRelayFilter.java[OAuth2TokenRelayFilter] フィルタ。このフィルタは、以前に取得したアクセストークンをユーザーのHTTPセッションから取得し、それらを下流に伝播します。

でhttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html[ @Order ]アノテーションも使用していることに注意してください。私たちの AppConfiguration 設定クラス。これは、 Filters がhttps://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/config/annotation/web/configuration/によって作成されたことを確認するためです。 WebSecurityConfigurerAdapter.html[ WebSecurityConfigurerAdapter ]は、他の WebSecurityConfigurerAdapters によって作成された Filters よりも優先されます。

たとえば、HTTPセッション識別子とOAuth2アクセストークンの両方をサポートするために、 Zuul アプリケーションに @ EnableResourceServer というアノテーションを付けることができます。ただし、そうすることで新しい Filters が作成され、デフォルトでは AppConfiguration クラスによって作成されたものより優先されます。これはhttps://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/webが原因で発生します。 ResouceServerConfiguration /springframework/security/oauth2/config/annotation/web/configuration/EnableResourceServer.java[ @EnableResourceServer ]は、デフォルトの order を3に指定し、 WebSecurityConfigureAdapter のデフォルトの order は100に指定します。

Resource __Serverに移る前に、いくつかのプロパティを設定する必要があります。

zuul:
  routes:
    resource-server-mvc-1:/resource-server-mvc-1/** **
    authorization-server-1:
      sensitiveHeaders: Authorization
      path:/authorization-server-1/** **
      stripPrefix: false
  add-proxy-headers: true

security:
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath:/login
    client:
      accessTokenUri: http://localhost:8769/authorization-server-1/oauth/token
      userAuthorizationUri:/authorization-server-1/oauth/authorize
      clientId: fooClient
      clientSecret: fooSecret
    resource:
      jwt:
        keyValue: "abc"
      id: fooScope
      serviceId: ${PREFIX:}resource

この設定を使用して、詳細に説明しすぎることなく、次のようになります。

  • 私たちの Zuul ルートを設定し、どのヘッダーを指定するべきかを言って

要求を下流に送信する前に追加/削除されます。

  • 私たちのアプリケーションができるようにするためにいくつかのOAuth2プロパティを設定する

Authorization Server と通信し、https://www.baeldung.com/spring-security-oauth-jwt[ JWT ]を symmetric 暗号化で設定します。

4. API - @ EnableResourceServer

これで Zuul アプリケーションが完成しました。次に、 Resource Server を作成しましょう。

@SpringBootApplication
@EnableResourceServer
@Controller
@RequestMapping("/")
class ResourceServerApplication {

    public static void main(String[]args) {
        SpringApplication.run(ResourceServerApplication.class, args);
    }

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public String helloWorld(Principal principal) {
        return "Hello " + principal.getName();
    }
}

これは、リクエストを開始した Principal name を返す単一のエンドポイントを公開する単純なアプリケーションです。

いくつかのプロパティを設定してまとめましょう。

security:
  basic:
    enabled: false
  oauth2:
    resource:
      jwt:
        keyValue: "abc"
      id: fooScope
      service-id: ${PREFIX:}resource

Resource Server のエンドポイントにアクセスするには、 有効なアクセストークン** (エッジノードにあるユーザーのHTTPセッションに格納されている)が必要です。

5.まとめ

この記事では、 @ EnableOAuth2Sso アノテーションと @ EnableResourceServer アノテーションの違いについて説明しました。また、 Zuul と単純なAPIを使用した実用的な例を使用してそれらを使用する方法も示しました。

この例の完全な実装はhttps://github.com/Baeldung/oauth-microservices/tree/master/1x[over Github]で見つけることができます。

ローカルで実行している場合は、アプリケーションを実行してテストできます。 at http://192.168.1.67:8765/resource-server-mvc-1