最新の安定バージョンについては、Spring Security 6.5.0 を使用してください! |
OAuth の移行
次の手順は、OAuth 2.0 の構成方法に関する変更に関連しています。
デフォルトの oauth2Login()
権限の変更
Spring Security 5 では、( oauth2Login()
を介して) OAuth2 または OpenID Connect 1.0 プロバイダーで認証するユーザーに与えられるデフォルトの GrantedAuthority
は ROLE_USER
です。
詳細については、ユーザー権限のマッピングを参照してください。 |
Spring Security 6 では、OAuth2 プロバイダーで認証するユーザーに与えられるデフォルトの権限は OAUTH2_USER
です。OpenID Connect 1.0 プロバイダーで認証するユーザーに与えられるデフォルトの権限は OIDC_USER
です。これらのデフォルトにより、OAuth2 または OpenID Connect 1.0 プロバイダーで認証されたユーザーをより明確に区別できます。
hasRole("USER")
や hasAuthority("ROLE_USER")
などの認可規則または式を使用して、この特定の権限を持つユーザーを認可している場合、Spring Security 6 の新しいデフォルトはアプリケーションに影響を与えます。
新しい Spring Security 6 デフォルトを選択するには、次の構成を使用できます。
Java
Kotlin
XML
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// ...
.oauth2Login((oauth2Login) -> oauth2Login
.userInfoEndpoint((userInfo) -> userInfo
.userAuthoritiesMapper(grantedAuthoritiesMapper())
)
);
return http.build();
}
private GrantedAuthoritiesMapper grantedAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
authorities.forEach((authority) -> {
GrantedAuthority mappedAuthority;
if (authority instanceof OidcUserAuthority) {
OidcUserAuthority userAuthority = (OidcUserAuthority) authority;
mappedAuthority = new OidcUserAuthority(
"OIDC_USER", userAuthority.getIdToken(), userAuthority.getUserInfo());
} else if (authority instanceof OAuth2UserAuthority) {
OAuth2UserAuthority userAuthority = (OAuth2UserAuthority) authority;
mappedAuthority = new OAuth2UserAuthority(
"OAUTH2_USER", userAuthority.getAttributes());
} else {
mappedAuthority = authority;
}
mappedAuthorities.add(mappedAuthority);
});
return mappedAuthorities;
};
}
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http {
// ...
oauth2Login {
userInfoEndpoint {
userAuthoritiesMapper = grantedAuthoritiesMapper()
}
}
}
return http.build()
}
private fun grantedAuthoritiesMapper(): GrantedAuthoritiesMapper {
return GrantedAuthoritiesMapper { authorities ->
authorities.map { authority ->
when (authority) {
is OidcUserAuthority ->
OidcUserAuthority("OIDC_USER", authority.idToken, authority.userInfo)
is OAuth2UserAuthority ->
OAuth2UserAuthority("OAUTH2_USER", authority.attributes)
else -> authority
}
}
}
}
<http>
<oauth2-login user-authorities-mapper-ref="userAuthoritiesMapper" ... />
</http>
オプトアウトの手順
新しい権限の構成で問題が発生する場合は、オプトアウトして、次の構成で ROLE_USER
の 5.8 権限を明示的に使用できます。
Java
Kotlin
XML
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// ...
.oauth2Login((oauth2Login) -> oauth2Login
.userInfoEndpoint((userInfo) -> userInfo
.userAuthoritiesMapper(grantedAuthoritiesMapper())
)
);
return http.build();
}
private GrantedAuthoritiesMapper grantedAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
authorities.forEach((authority) -> {
GrantedAuthority mappedAuthority;
if (authority instanceof OidcUserAuthority) {
OidcUserAuthority userAuthority = (OidcUserAuthority) authority;
mappedAuthority = new OidcUserAuthority(
"ROLE_USER", userAuthority.getIdToken(), userAuthority.getUserInfo());
} else if (authority instanceof OAuth2UserAuthority) {
OAuth2UserAuthority userAuthority = (OAuth2UserAuthority) authority;
mappedAuthority = new OAuth2UserAuthority(
"ROLE_USER", userAuthority.getAttributes());
} else {
mappedAuthority = authority;
}
mappedAuthorities.add(mappedAuthority);
});
return mappedAuthorities;
};
}
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http {
// ...
oauth2Login {
userInfoEndpoint {
userAuthoritiesMapper = grantedAuthoritiesMapper()
}
}
}
return http.build()
}
private fun grantedAuthoritiesMapper(): GrantedAuthoritiesMapper {
return GrantedAuthoritiesMapper { authorities ->
authorities.map { authority ->
when (authority) {
is OidcUserAuthority ->
OidcUserAuthority("ROLE_USER", authority.idToken, authority.userInfo)
is OAuth2UserAuthority ->
OAuth2UserAuthority("ROLE_USER", authority.attributes)
else -> authority
}
}
}
}
<http>
<oauth2-login user-authorities-mapper-ref="userAuthoritiesMapper" ... />
</http>
OAuth2 クライアントの非推奨への対応
Spring Security 6 では、非推奨のクラスとメソッドが OAuth2 クライアントから削除されました。それぞれの廃止予定は、直接の代替とともに以下にリストされています。
ServletOAuth2AuthorizedClientExchangeFilterFunction
メソッド setAccessTokenExpiresSkew(…)
は、次のいずれかに置き換えることができます。
ClientCredentialsOAuth2AuthorizedClientProvider#setClockSkew(…)
RefreshTokenOAuth2AuthorizedClientProvider#setClockSkew(…)
JwtBearerOAuth2AuthorizedClientProvider#setClockSkew(…)
メソッド setClientCredentialsTokenResponseClient(…)
は、コンストラクター ServletOAuth2AuthorizedClientExchangeFilterFunction(OAuth2AuthorizedClientManager)
に置き換えることができます。
詳細については、クライアント資格情報を参照してください。 |
OAuth2AuthorizedClientArgumentResolver
メソッド setClientCredentialsTokenResponseClient(…)
は、コンストラクター OAuth2AuthorizedClientArgumentResolver(OAuth2AuthorizedClientManager)
に置き換えることができます。
詳細については、クライアント資格情報を参照してください。 |
OidcClientInitiatedLogoutSuccessHandler
メソッド setPostLogoutRedirectUri(URI)
は setPostLogoutRedirectUri(String)
に置き換えることができます。
HttpSessionOAuth2AuthorizationRequestRepository
メソッド setAllowMultipleAuthorizationRequests(…)
を直接置き換えるものはありません。
AuthorizationRequestRepository
メソッド removeAuthorizationRequest(HttpServletRequest)
は removeAuthorizationRequest(HttpServletRequest, HttpServletResponse)
に置き換えることができます。
AbstractOAuth2AuthorizationGrantRequest
コンストラクター AbstractOAuth2AuthorizationGrantRequest(AuthorizationGrantType)
は AbstractOAuth2AuthorizationGrantRequest(AuthorizationGrantType, ClientRegistration)
に置き換えることができます。
ClientAuthenticationMethod
静的フィールド BASIC
は CLIENT_SECRET_BASIC
に置き換えることができます。
静的フィールド POST
は CLIENT_SECRET_POST
に置き換えることができます。
OAuth2AccessTokenResponseHttpMessageConverter
フィールド tokenResponseConverter
には直接の置換はありません。
メソッド setTokenResponseConverter(…)
は setAccessTokenResponseConverter(…)
に置き換えることができます。
フィールド tokenResponseParametersConverter
には直接の置換はありません。
メソッド setTokenResponseParametersConverter(…)
は setAccessTokenResponseParametersConverter(…)
に置き換えることができます。
NimbusAuthorizationCodeTokenResponseClient
クラス NimbusAuthorizationCodeTokenResponseClient
は DefaultAuthorizationCodeTokenResponseClient
に置き換えることができます。
NimbusJwtDecoderJwkSupport
クラス NimbusJwtDecoderJwkSupport
は、NimbusJwtDecoder
または JwtDecoders
に置き換えることができます。
ImplicitGrantConfigurer
クラス ImplicitGrantConfigurer
には直接の代替はありません。
|
AuthorizationGrantType
静的フィールド IMPLICIT
を直接置き換えるものはありません。
|