最新の安定バージョンについては、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 デフォルトを選択するには、次の構成を使用できます。

6.0 のデフォルトで oauth2Login() を構成する
  • 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 権限を明示的に使用できます。

5.8 のデフォルトで oauth2Login() を構成する
  • 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) に置き換えることができます。

詳細については、クライアント資格情報を参照してください。

OidcUserInfo

メソッド phoneNumberVerified(String) は phoneNumberVerified(Boolean) に置き換えることができます。

OAuth2AuthorizedClientArgumentResolver

メソッド setClientCredentialsTokenResponseClient(…​) は、コンストラクター OAuth2AuthorizedClientArgumentResolver(OAuth2AuthorizedClientManager) に置き換えることができます。

詳細については、クライアント資格情報を参照してください。

ClaimAccessor

メソッド containsClaim(…​) は hasClaim(…​) に置き換えることができます。

OidcClientInitiatedLogoutSuccessHandler

メソッド setPostLogoutRedirectUri(URI) は setPostLogoutRedirectUri(String) に置き換えることができます。

HttpSessionOAuth2AuthorizationRequestRepository

メソッド setAllowMultipleAuthorizationRequests(…​) を直接置き換えるものはありません。

AuthorizationRequestRepository

メソッド removeAuthorizationRequest(HttpServletRequest) は removeAuthorizationRequest(HttpServletRequest, HttpServletResponse) に置き換えることができます。

ClientRegistration

メソッド getRedirectUriTemplate() は getRedirectUri() に置き換えることができます。

ClientRegistration.Builder

メソッド redirectUriTemplate(…​) は redirectUri(…​) に置き換えることができます。

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 には直接の代替はありません。

implicit 付与型の使用は推奨されておらず、関連するすべてのサポートが Spring Security 6 で削除されています。

AuthorizationGrantType

静的フィールド IMPLICIT を直接置き換えるものはありません。

implicit 付与型の使用は推奨されておらず、関連するすべてのサポートが Spring Security 6 で削除されています。

OAuth2AuthorizationResponseType

静的フィールド TOKEN を直接置き換えるものはありません。

implicit 付与型の使用は推奨されておらず、関連するすべてのサポートが Spring Security 6 で削除されています。

OAuth2AuthorizationRequest

静的メソッド implicit() を直接置き換えるものはありません。

implicit 付与型の使用は推奨されておらず、関連するすべてのサポートが Spring Security 6 で削除されています。

JwtAuthenticationConverter の非推奨に対応

メソッド extractAuthorities は削除されます。JwtAuthenticationConverter を継承する代わりに、JwtAuthenticationConverter#setJwtGrantedAuthoritiesConverter を使用してカスタム権限付与コンバーターを提供してください。