随着spring-security-oauth 2和spring-security-jwt已退出历史舞台,遗留项目如何向Spring Security 5/6/7升级迁移可参考本文。 以下Spring Security OAuth指遗留的spring-security-oauth/spring-security-jwt。
一、客户端(Client)
在Spring Security OAuth中客户端的鉴权流程使用
@EnableOAuth2Client
注解,其他流程中需要构造和暴露OAuth2ClientContext
;但在Spring Security中客户端使用oauth2Client
DSL
方法。即Spring Security简化了Enable注解。在Spring Security OAuth中扩展RestTemplate,引入
OAuth2RestTemplate
,该类需要实例化并暴露为@Bean
;而在Spring Security使用组合而不是暴露OAuth2AuthorizedClientService
,来创建RestTemplate
拦截器或WebClient
的交互的过滤器函数,为基于Servlet
和WebFlux
的应用于提供ExchangeFilterFunction
。即Spring Security简化了RestTemplate
和WebClient
。为获取当前已授权的客户端,在Spring Security OAuth中注入
OAuth2ClientContext
实例,Spring Security OAuth使用Spring MVC的request
和session
来保存OAuth2ClientContext
实例;而在Spring Security
中使用自己的OAuth2AuthorizedClientRepository
。即Spring Security简化了客户端的解析。Spring Security OAuth通过Spring Boot配置属性来暴露单个客户端的配置;而Spring Security使用自己的
ClientRegistrationRepository
来表示客户端,可以使用Spring Security DSL,也可使用Spring Boot配置属性。即Spring Security增强了客户端注册。Spring Security OAuth使用spring-security-jwt来提供对JWT的支持,而Spring Security依赖Nimbus提供对JWT的支持。即Spring Security简化了对JWT的支持。
对于客户端的鉴权、刷新Token、客户端凭证、资源拥有者的密码凭证等配置参考如下代码:Spring Security ,Spring Security OAuth 。
二、登录(Login)
注意:此处的登录,在Spring Security指OAuth 2.0登录而Spring Security OAuth指单点登录(SSO)。
Spring Security OAuth的单点登录使用@EnableOAuth2Sso
注解,而Spring Security OAuth 2.0的登录使用Spring Security的oauth2Login()
DSL方法。
三、资源服务器(Resource Server)
Spring Security OAuth对资源服务器使用
EnableResourceServer
注解,而在Spring Security中使用oauth2ResourceServer
DSL方法。Spring Security OAuth对资源服务器暴露了两种不同的DSL ,通过继承
ResourceServerConfigurerAdapter
来配置;而Spring Security通过继承WebSecurityConfigurerAdapter
来配置,但目前随着Spring Security 5.7-M2起对该方法的弃用,转而改为WebSecurityCustomizer
等,请参考为升级6.0而准备的配置迁移 。Spring Security OAuth对于鉴权规则在两处指定: 1)
ResourceServerConfigurerAdapter
- 只要有bearer token
,所有规则在此指定; 2)WebSecurityConfigurerAdapter
- 如果没有bearer token
,对请求的所有规则在此指定。 而在Spring Security所有的认证规则通过一个或多个WebSecurityConfigurerAdapter
,同样注意Spring Security 5.7-M2后对其的弃用而改用的配置方式。Spring Security OAuth对自定义SpEL变量称为
oauth2
,对基于作用域(scope)的鉴权请求和方法,表达式写作为access("#oauth2.hasScope('scope')")
,参考这里 ;而在Spring Security将作用域转化为遵循鉴权授予命名规范(granted authority naming convention),对基于作用域的鉴权请求或方法,表达式写作为hasAuthority("SCOPE_scope")
,参考这里 。
对于资源服务器的配置可参考下表:
用例 | Spring Security | Spring Security OAuth |
---|---|---|
JWT + JWK | 示例 | 示例 |
JWT + Key | 示例 | 文档 |
Opaque Token | 示例 | 示例 |
w/ Actuator | 文档 | 示例 |
Audience Validation | 文档 | - |
Authorizing Requests | 文档 | 文档 |
四、其他(不可迁移的)
在Spring Security OAuth中,可配置
UserDetailsService
来查看用户对应的bearer token
,但在Spring Security中,可通过jwtAuthenticationConverter
的DSL方法。返回BearerTokenAuthentication
,其携带的OAuth2AuthenticatedPrincipal
实例可获取principal。在Spring Security OAuth中,可通过
ResourceServerSecurityConfigurer
的resourceId
方法给资源服务器一个标识,但在Spring Security中无此方法,但通过配置OAuth2TokenValidator
和AuthenticationEntryPoint
来获得audience validation和自定义规则(custom realm)。