随着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中客户端使用oauth2ClientDSL方法。即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中使用oauth2ResourceServerDSL方法。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)。
