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つの役割のいずれかに変換するコンポーネントを構成するように指示されます。
-
@ EnableResourceServer
アノテーションは、
https://docs.spring.io/spring-security/oauth/apidocs/org/springframework/security/oauth2/provider/authentication/OAuth2AuthenticationProcessingFilterを設定することによって、アプリケーションが
Resource Server
として動作することを可能にします。 .html[OAuth2AuthenticationProcessingFilter]
および他の同様に重要なコンポーネント
_.
_
逆に、
@ 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