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

 

MyOIDC v1.1.1 发布,基于 OIDC 协议的参考实现,根据各类库提供实现参考

MyOIDC  –基于OIDC协议的参考实现,根据各类库提供实现参考 。正式版本v1.1.1发布,主要更新内容:

  1. 修改启动方法为jar直接运行
  2. 更新How-To-Use.txt
  3. AccessToken使用时允许获取更详细用户信息
  4. 增加 JWKS test与使用说明示例
  5. jose4j升级使用0.7.1版本

openid

GitHub:   https://github.com/monkeyk/MyOIDC/tree/v1.1.1

Gitee:  https://gitee.com/mkk/MyOIDC/tree/v1.1.1

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

 

 

 

 

MyOIDC v1.1.0 发布–基于OIDC协议的参考实现,根据各类库提供实现参考

MyOIDC  –基于OIDC协议的参考实现,根据各类库提供实现参考 。第1个正式版本v1.1.0发布,主要更新内容:

  1. 实现OIDC协议的主要流程,包括 DiscoveryEndpoint等各类Endpoint提供实现参考;实现OIDC中主要的认证授权流程;JWKS API实现等。
  2. 实现myoidc-server, myoidc-client 两模块的各类功能细节,能实际使用,形成操作闭环。
  3. openid

V1.1.0 代码库链接:

GitHub:  https://github.com/monkeyk/MyOIDC/tree/v1.1.0

Gitee: https://gitee.com/mkk/MyOIDC/tree/v1.1.0/

 

SpringMVC校验数据方式总结(含示例源码)

SpringMVC对于提交表单(form submit)的数据校验与异常信息回显,个人常用有两种方式

方式一:使用Validator接口,实现Validator接口并编写校验的代码,

1

Validator是一个单独类处理,示例源码链接:https://gitee.com/shengzhao/spring-oauth-server/tree/1.0/src/main/java/com/monkeyk/sos/web/controller

在使用时示例如下:

2

示例源码链接:https://gitee.com/shengzhao/spring-oauth-server/blob/1.0/src/main/java/com/monkeyk/sos/web/controller/UserController.java

此方式简单明了,validator与controller分开。

 

方式二:使用全注解,需要扩展实现一些业务需要的数据校验(此文重点)

不需要额外增加一个类来处理,注解加在Model对象属性中,

3

UserFormDto是一个Model对象,@Size, @NotBlank,@Length, @Email为 java validation API中定义的注解类型,

示例源码链接:https://gitee.com/mkk/MyOIDC/blob/1.1.0/myoidc-server/src/main/java/myoidc/server/service/dto/UserFormDto.java

@UsernameValidation 是扩展自定义实现的数据校验(主要增加业务逻辑,如此处username要求唯一),其具体实现为:

5

其实现的关键是 UsernameValidator.java的实现,如下:

6

UsernameValidator实现ConstraintValidatior接口并提供实现,在isValid()方法中实现具体业务逻辑,返回true表示校验成功

示例源码链接:https://gitee.com/mkk/MyOIDC/tree/1.1.0/myoidc-server/src/main/java/myoidc/server/service/validation

 

——————————–

对于表单校验异常后的展示,SpringMVC提供了一套页面标签实现,如果是JSP页面,示例如下:

8

示例源码链接:https://gitee.com/shengzhao/spring-oauth-server/blob/config/src/main/webapp/WEB-INF/jsp/user_form.jsp

如果是 SpringBoot中的 thymeleaf,示例如下:

7

示例源码链接:https://gitee.com/mkk/MyOIDC/blob/1.1.0/myoidc-server/src/main/webapp/WEB-INF/view/admin/user_form.html

(页面展示的标签方式有多种形式,可根据实际需要进行选择,如可以针对单个的字段进行异常显示)

 

浅层大脑皮层之思索

2.20  0:54  周四一大堆杂事工作,各类的不满意不经意不成长的人少些许是用心的,结束此日。

积极向前看,工作在多类事务并行而缺少过多的专注而言不衷己的心态,看书也是浅层大脑皮层在活动,且到了应该睡觉休息养身,一股冷意从空气中流传,下雨了的夜晚更多几分的愁意,思于无从坚持以每日写日记而想出记录每日睡觉时间保证能每日记录一行或几行在本子中,也如此坚持了最近几年的日记于今日,还继续写。

特殊年景的时日,疫情不会消失很快需跟上不断变化的光景且不断学习—-主要靠看书与工作中的接触。快了下周是有可能再次回来办公区办公楼,回归想要的传统生活节奏罢!

做菜三二支,爬上床被盖上被子,暖和地美美睡去而不便在9.00时起床方算美的早晨,可也只能静待周末的时光来临,每一日都一样都在小区里,不扩散不乱走,我不知,人不知病毒在隐藏中随时想发起的攻击,不堪一击的人类因转轮回没有主次,都于命中神中注定,无欲望有欲望控制不了的欲望,世间就是活不明白,都活不明白时也就打开潘多拉盒子推倒重来,轮转!

都是在没有疲倦地向前发展着,终点已经固定,无多的叫喊,思索,无望,离别等等一多多都是人的一番感情的展露罢。

2.21 0:40  周五,在家工作的类似最后一天也感受到上班那类感受:中午不睡,下午崩溃。去办健康证明(因为疫情),去洗车终于成功还免费消毒国内空间,干净的车子是好心情的一体会。

计划着的下周回到办公室开始2020继续的日子,虽说大可能继续等待着又一个14天的光景—-隔离时光;头发也理了,也洗澡了,做不完的工作压过头顶也得健康地顶着向前一直走—-此生活之工作真谛。

看了《人间失格》一书在晚上扒在床上,怕看得无法自拔而强迫自己睡觉,理智而合理,细水长流一般地关灯,上眼药水,然后真睡去。

 

2020-01-31,过了一个长长的春节假期

2020-01-31,农历正月初七,春节的第8天,宅在老家里,还剩下2天假期,明天准备返回工作城市。

村子里的广播一遍又一遍播放着病毒防疫的各类注意事项,这是生物病毒,不是电脑病毒,但比电脑病毒严重多了。远在西南偏远山区的小村庄,也受到影响。

这时刻,能深刻地感受到大家都在一起,一起抗战,一起需要口罩与防治措施,等等。

宅在家成了作个人贡献的重要环节,看着电视了解一切,都去当监工跟进,不添堵,不增加麻烦。

 

一种休息久了很需要工作才能满足的感觉油然而生,我们作好准备,迎接更可变的未来。

心态的积极面对,总会更好许多。

2020年阅读计划

阅读自有书,2020阅读计划

  1. 《Effective Java中文版(原书第3版)》2月
  2. 《持续交付:发布可靠软件的系统方法》7月
  3. 《鞋狗:耐克创始人菲尔.奈特亲笔自传》3月
  4. 《论人类不平等的起源和基础》
  5. 《新未来简史:区块链,人工智能,大数据陷阱与数字化生活》3月
  6. 《人间失格》2月
  7. 《企业IT架构转型之道》1月
  8. 《和谐拯救危机》
  9. 《演进式架构》
  10. 《暗网I:揭秘数字货币骗局》
  11. 《区块链 领导干部读本》6月
  12. 《译文纪实:血疫》6月
  13. 《基因,大脑和人类潜能》
  14. 《深入分布式缓存:从原理到实践》6月
  15. 《程序员必读之软件架构》4月
  16. 《程序员思维修炼(修订版)》5月
  17. 《深入理解Spring Cloud与微服务构建(第2版)》4月
  18. 《大数据之路:阿里巴巴大数据实践》5月
  19. 《用户故事地图》7月
  20. 《美国独行:西方世界的末日》
  21. 《税法禁行线》
  22. 《吃,是一种公民行为》7月
  23. 《病毒星球》7月
  24. 《平凡的世界》全三册 7月

 

 

——————————-

2019年阅读计划

2018年阅读计划

2017年阅读计划

2016年及之前所看之书

解决oauth_access_token表出现一个UserName有多条数据异常

在spring-oauth-server的ISSUE #IAI2E#IP5N9中提到的oauth_access_token表会出现多条相同username的数据的异常情况,

解决办法如下:

1.对 oauth_access_token 表的authentication_id 字段增加唯一索引,创建索引SQL如下:

ALTER TABLE oauth_access_token ADD UNIQUE INDEX authentication_id_unique_index(authentication_id);

若是新建数据库,则直接按照 spring-oauth-server开发要求运行SQL文件(initial_db.ddl)即可(创建表的SQL中已经加了唯一索引)

 

2.推荐使用将access token 数据存入redis来提升性能与解决此问题,详细请访问 http://andaily.com/blog/?p=19776