oauth2-shiro 2.0.0版本发布,安全大升级

oauth2-shiro v2.0.0版本正式发布,在距上一次发布7年后,更新了大版本,对安全漏洞等问题进行大升级。

该版本主要更新内容:

  1. 升级使用springboot,调整工程结构,打包由war换成jar,使用thymeleaf替换servlet/jsp;spring大版本升级到5.3提升安全性。
  2. JDK由1.7升级到1.8,日志框架使用logback替换log4j(处理掉log4j安全漏洞)。
  3. 升级shiro版本到v1.11.0,解决相应的shiro版本漏洞。
  4. 密码存储算法由MD5替换为SHA-256,并支持盐(salt),让密码存储更安全可靠(通过配置参数authz.store.credentials.alg来控制与向下兼容)。
  5. OAuth token支持使用JWT格式(通过配置参数authz.token.generator.type来控制与向下兼容)。
  6. 对初始的账户密码与client secret使用更加安全的密码策略:包括大小写字母,数字与特殊符号,长度至少10位。

v2.0.0版本链接:https://gitee.com/mkk/oauth2-shiro/tree/2.0.0/

【推荐升级】

spring-oauth-server v2.1.0增加token存储的配置说明

spring-oauth-server的v2.1.0版本中增加了新的配置属性:

sos.token.store=jwt

该配置项有两个可选值:jwt或jdbc(默认)

jwt – 表示使用jwt作为token的数据格式,性能更高,推荐使用;配置实现详见 JWTTokenStoreConfiguration.java类;

jdbc – 表示使用数据库存储token的数据(包括refresh token),支持之前版本的实现,也是默认选项,对应的配置实现详见 JdbcTokenStoreConfiguration.java

https://gitee.com/shengzhao/spring-oauth-server

spring-oauth-server 2.0.2 发布,扩展 OAuth2 Server

spring-oauth-server在2020-06-04更新发布了2.0.2版本,spring-oauth-server是Spring与Oauth2整合示例。

此版本更新内容如下:

1.Fix CVE-2019-3778, use spring-security-oauth 2.3.5.RELEASE

2.解决数据库多条 access_token问题,增加唯一约束

3.升级Spring-Boot版本为2.1.4.RELEASE

 

2.0.2版本release链接: https://gitee.com/shengzhao/spring-oauth-server/releases

 

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ

过去几年的OAuth2经历与使用,总结一下,记录有关 access_token, refresh_token的各类配置与场景适应,到此以自问自答的形式把这些琐碎的点总结下来。

说明:以下问答中的截图或表等信息以 spring-oauth-server 中配置为参考。

> 问:可以设置永不过期的 refresh_token吗?

答:可以,需要按以下步骤操作:首先在client_details定义中不设置 refresh_token_validity 字段值(即默认null),其次在配置OAuth2的DefaultTokenServices时将refreshTokenValiditySeconds属性值配置为0或小于0(默认为30天,若想修改为其他默认值也在此配置),关键代码看下图

111

> 问:可以设置永不过期的 access_token吗?

答:可以,但不推荐使用(因为永不过期意味着除手动清除外无安全性可言);若需要按以下步骤操作:首先在client_details定义中不设置 access_token_validity字段值(即默认null),其次在配置OAuth2的DefaultTokenServices时将accessTokenValiditySeconds属性值配置为0或小于0(默认为12小时,若想修改为其他默认值也在此配置),关键代码看下图

8888

> 问:refresh_token功能可以禁用吗?

答:可以,首先要求client_details的grant_type不支持 refresh_token,即authorized_grant_types字段中无 refresh_token,其次在配置OAuth2的DefaultTokenServices时将supportRefreshToken配置为false即可,关键代码看下图

222

> 问:默认的 access_token有效时间是多少?默认的 refresh_token有效时间是多少?在哪看

答:默认access_token有效时间为12小时,默认refresh_token有效时间为30天,这两默认值在OAuth2的DefaultTokenServices中定义的,如下图:

3333

若想改变默认值,只需要在定义client_details是修改字段access_token_validity (access_token有效时间)与 refresh_token_validity (refresh_token有效时间),单位为:秒

> 问:可否在每次调用 refresh token操作时重新生成一个 refresh_token值?若可以如何做

答:可以支持此功能,具体为在配置OAuth2的DefaultTokenServices时将reuseRefreshToken属性配置为fasle即可(默认true),关键代码看下图

44

> 问:能否在生成access_token后加自己扩展的代码逻辑?若能如何做

答:可以加自己的扩展逻辑。首先需要写一个类实现接口 TokenEnhancer.java ,实现方法 enhance方法,一示例如下:

555

其次在配置 OAuth2的DefaultTokenServices时增加tokenEnhancer属性配置,关联扩展实现的类即可,关键代码如下

6666

实际上Spring Security OAuth2中实现JWT从而支持OIDC流程就是扩展TokenEnhancer.java来实现的(有一个实现类 JwtAccessTokenConverter.java)

> 问:生成access_token值是一UUID值吧?能否不使用UUID值,想扩展如何办?

答:确实生成的access_token是一UUID值,若要扩展不使用UUID,需要这样做:首先写一个子类继承DefaultTokenServices.java,其次将DefaultTokenServices.java的源代码复制到扩展的子类中,并修改createAccessToken方法与createRefreshToken方法中的代码(如此做是因为两方法定义的private的),关键代码如下

7777

另一种办法是通过扩展TokenEnhancer.java 来实现(详细见上一问答)

> 问:如何提高 access_token, refresh_token的性能,默认存储在数据库中在高并发大数据时数据库连接会成为性能瓶颈的

答:在大数据高并发环境时,建议使用Redis,将access_token, refresh_token存储在Redis中实现,具体在配置OAuth2的TokenStore时使用子类 RedisTokenStore(默认使用的子类为JdbcTokenStore),更多信息请查看 http://andaily.com/blog/?p=19776

更高的性能推荐使用JWT格式的token,详见 https://andaily.com/blog/?p=20133

> 问:OAuth2.0之后有新的版本协议?若有在使用上有哪些变化呢?

答:有,OAuth2.1版本协议,状态与特征详见 https://andaily.com/blog/?p=20004

Spring Boot中Spring Security OAuth2的变化(相比XML配置)

在升级使用基于 Spring Boot 的 Spring Security OAuth2 后,相比于XML配置,除了所谓的“零配置”区别外,

在OAuth2的使用与流程中有以下几点变化

 

1. resource-id 只能配置一个(或不要);在XML配置时,可设置多个resource-id(详细请点此);但在Spring Boot中,

一个程序中只能配置唯一的一个resource-id (详细请点此)—— 个人觉得是因为一个微服务就是一资源(resource)吧。

 

2.ClientDetails中的 client_secret 值加密存储;使用的加密方式与Spring Security的密码加密方式一致;这是安全上

的一大提升,点赞。

 

 

https://gitee.com/shengzhao/spring-oauth-server