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