随着spring-security-oauth 2和spring-security-jwt已退出历史舞台,遗留项目如何向Spring Security 5/6/7升级迁移可参考本文。 以下Spring Security OAuth指遗留的spring-security-oauth/spring-security-jwt。

一、客户端(Client)

  1. 在Spring Security OAuth中客户端的鉴权流程使用@EnableOAuth2Client注解,其他流程中需要构造和暴露OAuth2ClientContext;但在Spring Security中客户端使用oauth2Client DSL方法。即Spring Security简化了Enable注解。

  2. 在Spring Security OAuth中扩展RestTemplate,引入OAuth2RestTemplate,该类需要实例化并暴露为@Bean;而在Spring Security使用组合而不是暴露OAuth2AuthorizedClientService,来创建RestTemplate拦截器或WebClient的交互的过滤器函数,为基于ServletWebFlux的应用于提供ExchangeFilterFunction。即Spring Security简化了RestTemplateWebClient

  3. 为获取当前已授权的客户端,在Spring Security OAuth中注入OAuth2ClientContext实例,Spring Security OAuth使用Spring MVC的requestsession来保存OAuth2ClientContext实例;而在Spring Security中使用自己的OAuth2AuthorizedClientRepository。即Spring Security简化了客户端的解析。

  4. Spring Security OAuth通过Spring Boot配置属性来暴露单个客户端的配置;而Spring Security使用自己的ClientRegistrationRepository来表示客户端,可以使用Spring Security DSL,也可使用Spring Boot配置属性。即Spring Security增强了客户端注册。

  5. Spring Security OAuth使用spring-security-jwt来提供对JWT的支持,而Spring Security依赖Nimbus提供对JWT的支持。即Spring Security简化了对JWT的支持。

对于客户端的鉴权、刷新Token、客户端凭证、资源拥有者的密码凭证等配置参考如下代码:Spring SecuritySpring 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)

  1. Spring Security OAuth对资源服务器使用EnableResourceServer注解,而在Spring Security中使用oauth2ResourceServer DSL方法。

  2. Spring Security OAuth对资源服务器暴露了两种不同的DSL ,通过继承ResourceServerConfigurerAdapter来配置;而Spring Security通过继承WebSecurityConfigurerAdapter来配置,但目前随着Spring Security 5.7-M2起对该方法的弃用,转而改为WebSecurityCustomizer等,请参考为升级6.0而准备的配置迁移

  3. Spring Security OAuth对于鉴权规则在两处指定: 1) ResourceServerConfigurerAdapter - 只要有bearer token,所有规则在此指定; 2) WebSecurityConfigurerAdapter - 如果没有bearer token,对请求的所有规则在此指定。 而在Spring Security所有的认证规则通过一个或多个WebSecurityConfigurerAdapter,同样注意Spring Security 5.7-M2后对其的弃用而改用的配置方式。

  4. Spring Security OAuth对自定义SpEL变量称为oauth2,对基于作用域(scope)的鉴权请求和方法,表达式写作为access("#oauth2.hasScope('scope')"),参考这里 ;而在Spring Security将作用域转化为遵循鉴权授予命名规范(granted authority naming convention),对基于作用域的鉴权请求或方法,表达式写作为hasAuthority("SCOPE_scope"),参考这里

对于资源服务器的配置可参考下表:

用例Spring SecuritySpring Security OAuth
JWT + JWK示例示例
JWT + Key示例文档
Opaque Token示例示例
w/ Actuator文档示例
Audience Validation文档-
Authorizing Requests文档文档

四、其他(不可迁移的)

  1. 在Spring Security OAuth中,可配置UserDetailsService来查看用户对应的bearer token,但在Spring Security中,可通过jwtAuthenticationConverter的DSL方法。返回BearerTokenAuthentication,其携带的OAuth2AuthenticatedPrincipal实例可获取principal。

  2. 在Spring Security OAuth中,可通过ResourceServerSecurityConfigurerresourceId方法给资源服务器一个标识,但在Spring Security中无此方法,但通过配置OAuth2TokenValidatorAuthenticationEntryPoint来获得audience validation和自定义规则(custom realm)。

五、参考文献

  1. Spring Security OAuth - Spring Boot

  2. Spring Security OAuth - Preparing for 6.0

  3. Spring Security - Migrating to 6.0