对于最新的稳定版本,请使用 Spring Security 6.3.3! |
对于最新的稳定版本,请使用 Spring Security 6.3.3! |
以下步骤与有关如何配置 OAuth 2.0 的更改相关。
更改默认权限oauth2Login()
在 Spring Security 5 中,为使用 OAuth2 或 OpenID Connect 1.0 提供程序(通过 )进行身份验证的用户提供的默认值是 。GrantedAuthority
oauth2Login()
ROLE_USER
有关更多信息,请参阅映射用户权限。 |
在 Spring Security 6 中,授予使用 OAuth2 提供者进行身份验证的用户的默认权限是 。
授予使用 OpenID Connect 1.0 提供程序进行身份验证的用户的默认权限为 。
这些默认值允许更清楚地区分已使用 OAuth2 或 OpenID Connect 1.0 提供者进行身份验证的用户。OAUTH2_USER
OIDC_USER
如果您使用授权规则或表达式(例如或)来授权具有此特定权限的用户,则 Spring Security 6 中的新默认值将影响您的应用程序。hasRole("USER")
hasAuthority("ROLE_USER")
要选择新的 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>
选择退出步骤
如果配置新权限给您带来麻烦,您可以选择退出并通过以下配置显式使用 5.8 权限。ROLE_USER
-
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(…)
该方法可以替换为 constructor 。setClientCredentialsTokenResponseClient(…)
ServletOAuth2AuthorizedClientExchangeFilterFunction(OAuth2AuthorizedClientManager)
有关更多信息,请参阅 客户端凭证 。 |
OAuth2AuthorizedClientArgumentResolver
该方法可以替换为 constructor 。setClientCredentialsTokenResponseClient(…)
OAuth2AuthorizedClientArgumentResolver(OAuth2AuthorizedClientManager)
有关更多信息,请参阅 客户端凭证 。 |
OidcClientInitiatedLogoutSuccessHandler
该方法可替换为 。setPostLogoutRedirectUri(URI)
setPostLogoutRedirectUri(String)
HttpSessionOAuth2AuthorizationRequestRepository
该方法没有直接的替代。setAllowMultipleAuthorizationRequests(…)
AuthorizationRequestRepository
该方法可替换为 。removeAuthorizationRequest(HttpServletRequest)
removeAuthorizationRequest(HttpServletRequest, HttpServletResponse)
AbstractOAuth2AuthorizationGrantRequest
构造函数可以替换为 .AbstractOAuth2AuthorizationGrantRequest(AuthorizationGrantType)
AbstractOAuth2AuthorizationGrantRequest(AuthorizationGrantType, ClientRegistration)
ClientAuthenticationMethod
static 字段可以替换为 。BASIC
CLIENT_SECRET_BASIC
static 字段可以替换为 。POST
CLIENT_SECRET_POST
OAuth2AccessTokenResponseHttpMessageConverter
该字段没有直接替代。tokenResponseConverter
该方法可替换为 。setTokenResponseConverter(…)
setAccessTokenResponseConverter(…)
该字段没有直接替代。tokenResponseParametersConverter
该方法可替换为 。setTokenResponseParametersConverter(…)
setAccessTokenResponseParametersConverter(…)
NimbusAuthorizationCodeTokenResponseClient
该类可以替换为 。NimbusAuthorizationCodeTokenResponseClient
DefaultAuthorizationCodeTokenResponseClient
ImplicitGrantConfigurer
该类没有直接替换。ImplicitGrantConfigurer
不建议使用授权类型,并且在 Spring Security 6 中删除了所有相关支持。 |
有关更多信息,请参阅 客户端凭证 。 |
有关更多信息,请参阅 客户端凭证 。 |
不建议使用授权类型,并且在 Spring Security 6 中删除了所有相关支持。 |
不建议使用授权类型,并且在 Spring Security 6 中删除了所有相关支持。 |
不建议使用授权类型,并且在 Spring Security 6 中删除了所有相关支持。 |
不建议使用授权类型,并且在 Spring Security 6 中删除了所有相关支持。 |
地址弃用JwtAuthenticationConverter
该方法将被删除。
请提供自定义的授予权限转换器,而不是扩展 。extractAuthorities
JwtAuthenticationConverter
JwtAuthenticationConverter#setJwtGrantedAuthoritiesConverter