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

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

 

各类JWT库(java)的使用与评价

https://jwt.io/ 网站中收录有各类语言的JWT库实现(有关JWT详细介绍请访问 https://jwt.io/introduction/),

其中JAVA语言到目前(2018-06)有6个实现库,如下图:

jwt

按顺序依次是

Auth0实现 的 java-jwt

Brian Campbell实现的 jose4j

connect2id实现的 nimbus-jose-jwt

Les Haziewood实现的 jjwt

Inversoft实现的prime-jwt

Vertx实现的vertx-auth-jwt.

 

以下是各个库的使用测试

java-jwt

oauth0

完整测试链接  https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/Auth0JwtTest.java

点评:

Auth0提供的JWT库简单实用, 依赖第三方(如JAVA运行环境)提供的证书信息(keypair);

有一问题是在 生成id_token与 校验(verify)id_token时都需要 公钥(public key)与密钥(private key), 个人感觉是一不足(实际上在校验时只需要public key即可)

 

jose4j

jose4j

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/Jose4JTest.java

点评:

jose4j提供了完整的JWT实现, 可以不依赖第三方提供的证书信息(keypair, 库本身自带有RSA的实现),类定义与JWT协议规定匹配度高,易理解与上手

对称加密与非对称加密都有提供实现

 

nimbus-jose-jwt

nimbus

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/NimbusJoseJwtTest.java

点评:

nimbus-jose-jwt库类定义清晰,简单易用,易理解 , 依赖第三方提供的证书信息(keypair), 对称算法 与非对称算法皆有实现.

 

jjwt

jjwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/JJwtTest.java

点评:

jjwt小巧够用, 但对JWT的一些细节包装不够, 比如 Claims (只提供获取header,body)

 

prime-jwt

primejwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/PrimeJwtTest.java

点评:

prime jwt库怎么说呢, 有些地方不符合JAVA语言规范, 支持对称算法(HMAC) 与非对称算法(RSA), 也算容易理解

 

vertx-auth-jwt

vertxjwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/VertxAuthJwtTest.java

 点评:

Vertx Auth Jwt 库算是最不容易理解的一个库了.花了不少时间才弄通这一示例. 不容易上手. 并且生成与校验id_token 时都需要公钥与私钥,不足.

 

———————————————————

以下是在使用中的一些总结或注意点

1. 几乎所有库都要求JAVA版本1.7或更高版本, 1.6或以下的版本需要二次开发(或不支持)

2.从易用性, 扩展性, 完整性等来看, 使用首先推荐 jose4j, 其次是 Nimbus-jose-jwt.

3. JWT是实现OIDC的基石,掌握其使用对实现OIDC有很大帮助(同时对JAVA证书使用, PKI体系的掌握也有要求)

 

 

https://github.com/monkeyk/MyOIDC

是否已经在远离了开源?

淌过全身的冷水,突然发现,多久没在写过开源的代码了.

那些开源的项目 spring-oauth-server, oauth2-shiro, HeartBeat 等多久没再更新过版本了.

查看着过去的提交记录, 我是否已经在远离了开源,远离了开源精神与 开源代码…

猛然发现,2017快过一半, 我却尚未那怕更新一个小版本, 没有, 都没有.

翻看着过去的日子, 时间都去哪了, 上班,工作,加班,继续不断的上班,工作,….

没有的开源码代码的精神了????

看着大家的捐助, 不断增大的技术交流微信群(OAuth-OIDC),; 我去在干些什么去了;;

 

没有进步, 没有开源的进步, 只在流逝的日子中渐渐远离.远离….

不断更新的技术, 我却在有了些停止不前,不在路上.

曾经把一个简单的事做成开源的小程序(HeartBeat), 是更需要更多的继续….

你现在的生活还有激情吗?你心中的火焰还在燃烧吗?    疑问着自己

 

请将身体更新, 请将代码更新, 请继续开源精神, …

人生最重要的不是索取,人生最重要的是奉献…

my_keyboard

“没有什么能够阻挡, 你对自由的向往,天马行空的生涯, 你的心了无牵挂, ….  也曾感觉彷徨, 当你低头的瞬间, 才发现脚下的路, ….”

—<蓝莲花> 许巍

http://bd.kuwo.cn/yinyue/203139

 

spring-oauth-server 0.6 发布,OAuth2 与 Spring Security 安全应用整合

spring-oauth-server 0.6版本发布,该版本主要增加有缓存的支持, 具体的功能更新如下:

  • (150) – 修改OAUTH错误时返回JSON数据
  • (151) – 数据添加Ehcache缓存支持
  • (158) – 对配置,代码必要的地方添加注释,方便理解
  • 添加OIDC协议文档

OIDC是基于OAuth2的下一代身份认证授权协议,在0.6版本中添加了对OIDC1.0版本协议文档,同时在进行中文的翻译,具体请访问 https://andaily.com/blog/?p=440

spring-oauth-server 是一个整合OAuth2与Spring Security的安全应用项目,是从https://github.com/spring-projects/spring-security-oauth/tree/master/spring-security-oauth2扩展的符合实际项目需要的开源项目,可扩展为移动SSO解决方案.

0.6版本访问地址: http://git.oschina.net/shengzhao/spring-oauth-server/tree/0.6/

 

OAuth支持的几类 grant_type 及说明

在OAuth2.1中,对各类grant_type进行了修正(相比OAuth2.0),更符合安全发展需求。

    1. authorization_code — 授权码模式(即先登录获取code,再获取token)
    2. authorization_code + PKCE — 授权码模式+PKCE (即先登录获取code, 请求时增加参数code_challengecode_challenge_method; 再获取token,增加参数code_verifier)
    3. password — 密码模式(将用户名,密码传过去,直接获取token) 【OAuth2.1不推荐使用,安全性差
    4. client_credentials — 客户端模式(无用户,用户向客户端注册,然后客户端以自己的名义向’服务端’获取资源)
    5. implicit — 简化模式(在redirect_uri 的Hash传递token; Auth客户端运行在浏览器中,如JS,Flash)【OAuth2.1不再支持
    6. device_code — (全称 urn:ietf:params:oauth:grant-type:device_code)适用于各类无输入键盘的物联网智能设备进行认证授权, 通过类似’扫码登录’形式完成整个授权流程【OAuth2.1新增】
    7. jwt-bearer — (全称 urn:ietf:params:oauth:grant-type:jwt-bearer)是一类增强client端请求安全性的断言(assertion)实现; 通过类似’双向SSL’的机制来让server端验证client端的签名实现强安全性【OAuth2.1新增】
    8. refresh_token — 刷新access_token

对OAuth2.1的状态与特征请查看 https://andaily.com/blog/?p=20004。在 spring-oauth-server 的v3.0.0版本中将提供完整的OAuth2.1支持。

推荐大家升级使用更安全的OAuth2.1实现,同时拥抱OIDC(https://andaily.com/blog/?p=440)。

若需要对各类grant_type测试, 请访问 http://git.oschina.net/mkk/spring-oauth-client 项目