Spring Security 5.0.0 M4 发布
我很高兴代表社区宣布 Spring Security 5.0.0 M4 发布。此版本包含错误修复、新功能,并基于 Spring Framework 5.0.0 RC4。您可以在变更日志中找到完整的详细信息。此版本的亮点包括
OAuth2 / OIDC
OAuth2 登录 Java 配置
对 HttpSecurity.oauth2Login()
DSL 进行了一些改进。
您现在可以使用 AuthorizationGrantTokenExchanger
或 SecurityTokenRepository<AccessToken>
的自定义实现来配置 Token 端点,如下所示
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.tokenEndpoint()
.authorizationCodeTokenExchanger(this.authorizationCodeTokenExchanger())
.accessTokenRepository(this.accessTokenRepository());
}
我们还增加了自定义 Authorization 端点和 Redirection 端点的请求路径的功能
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.authorizationEndpoint()
.requestMatcher(new AntPathRequestMatcher("/custom-path/{clientAlias}"))
.and()
.redirectionEndpoint()
.requestMatcher(new AntPathRequestMatcher("/custom-path/callback/{clientAlias}"));
}
与 Spring Security 中的所有 AbstractAuthenticationProcessingFilter
一样,您还可以设置自定义的 AuthenticationSuccessHandler
和 AuthenticationFailureHandler
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.successHandler(this.customAuthenticationSuccessHandler())
.failureHandler(this.customAuthenticationFailureHandler());
}
安全令牌存储库
我们引入了 SecurityTokenRepository<T extends SecurityToken>
抽象,它负责 SecurityToken
的持久化。
最初的实现 InMemoryAccessTokenRepository
提供了 AccessToken
的持久化。在即将发布的版本中,我们还将提供一个支持 Refresh Token 持久化的实现。
ID 令牌和声明
对 IdToken
进行了一些小的改进,同时完善了 JwtClaimAccessor
、StandardClaimAccessor
和 IdTokenClaimAccessor
的实现细节,这些类提供了方便访问其关联结构中 claims
的方式,例如 Jwt
、IdToken
、UserInfo
。
授权请求改进
我们增加了 AuthorizationRequestRepository
将 Authorization Request 持久化到 Cookie
的功能。当前的默认实现是持久化到 HttpSession
中,但是可以提供一个自定义实现来代替持久化到 Cookie
。
还增加了对 AuthorizationCodeRequestRedirectFilter
中配置的 redirect-uri
中的 URI
变量的支持。
OAuth2 客户端属性
对配置 OAuth 2.0 Client 的属性进行了一些小的更新。以下配置概述了当前结构。您会注意到支持配置多个客户端,例如 google、github、okta 等。
security:
oauth2:
client:
google:
client-id: your-app-client-id
client-secret: your-app-client-secret
client-authentication-method: basic
authorization-grant-type: authorization_code
redirect-uri: "{scheme}://{serverName}:{serverPort}{contextPath}/oauth2/authorize/code/{clientAlias}"
scope: openid, profile, email, address, phone
authorization-uri: "https://#/o/oauth2/v2/auth"
token-uri: "https://www.googleapis.com/oauth2/v4/token"
user-info-uri: "https://www.googleapis.com/oauth2/v3/userinfo"
user-name-attribute-name: "sub"
jwk-set-uri: "https://www.googleapis.com/oauth2/v3/certs"
client-name: Google
client-alias: google
github:
...
okta:
...
使用新的 Spring Security OAuth 2.0 / OpenID Connect 1.0 登录功能的完整示例可以在 Spring Security 示例中的 oauth2login 中找到。该指南将引导您完成使用外部 OAuth 2.0 或 OpenID Connect 1.0 Provider 设置示例应用程序以进行 OAuth 2.0 登录的步骤。
响应式安全
响应式方法安全
Spring Security 的响应式支持现在通过利用 Reactor 的 Context 包含了方法安全。亮点如下,您可以在 samples/javaconfig/hellowebflux-method 中找到它的完整示例
第一步是使用 @EnableReactiveMethodSecurity
启用对 @PreAuthorize
和 @PostAuthorize
注解的支持。此步骤确保对象得到正确代理。
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfig {
下一步是创建一个使用 @PreAuthorize
或 @PostAuthorize
注解的服务。例如
@PreAuthorize("hasRole('ADMIN')")
public Mono<String> findMessage() {
Spring Security 的 WebFlux 支持将确保 Reactor Context 会填充当前用户,该用户用于确定是否授予或拒绝访问。
Spring Security 的标准 @WithMockUser
和相关注解已更新,可与响应式方法安全一起使用。例如
@RunWith(SpringRunner.class) // ... public class HelloWorldMessageServiceTests { @Autowired HelloWorldMessageService messages;
@Test public void messagesWhenNotAuthenticatedThenDenied() { StepVerifier.create(this.messages.findMessage()) .expectError(AccessDeniedException.class) .verify(); }
@Test @WithMockUser public void messagesWhenUserThenDenied() { StepVerifier.create(this.messages.findMessage()) .expectError(AccessDeniedException.class) .verify(); }
@Test @WithMockUser(roles = "ADMIN") public void messagesWhenAdminThenOk() { StepVerifier.create(this.messages.findMessage()) .expectNext("Hello World!") .verifyComplete(); } }
测试支持也与 TestWebClient
良好配合。例如
@RunWith(SpringRunner.class)
// ...
public class HelloWebfluxMethodApplicationTests {
@Autowired
ApplicationContext context;
WebTestClient rest;
@Before
public void setup() {
this.rest…