Spring cloud微服务安全实战-3-6API安全机制之数据校验_batch
Posted 青春是课桌下风干的鼻屎,是借了不还的直尺。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring cloud微服务安全实战-3-6API安全机制之数据校验_batch相关的知识,希望对你有一定的参考价值。
校验:非空、唯一性等校验
密码的加密:密码加密来存储。
如何做https的访问
校验
一个层面是接口层面,另外一个层面是数据库层面。
Springboot给我们提供了简单的封装
校验的包里面还有其他的注解。
IDEA里面鼠标选中按住Ctrl键盘直接跳到注解的包下面
然后在参数之前加上注解。@Validated 表示传进来的这个UserInfo需要去做校验
运行程序查看效果
详细的错误信息
用户名和密码都去掉
返回的errors就是一个数组
{ "timestamp": "2019-12-11T08:34:27.894+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "NotBlank.userInfo.password", "NotBlank.password", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "userInfo.password", "password" ], "arguments": null, "defaultMessage": "password", "code": "password" } ], "defaultMessage": "密码不能为空", "objectName": "userInfo", "field": "password", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "NotBlank.userInfo.username", "NotBlank.username", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "userInfo.username", "username" ], "arguments": null, "defaultMessage": "username", "code": "username" } ], "defaultMessage": "用户名不能为空", "objectName": "userInfo", "field": "username", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" } ], "message": "Validation failed for object=\'userInfo\'. Error count: 2", "path": "/users" }
postman里面的设置
Content-Type:application/json
{"name":"jojo","username":"","password":""}
数据库层面的校验
数据库的实体类也要加上非空的注解。
因为传进来的数据 经过Service层的业务逻辑,可以能会做一些修改后再保存到数据库内,所以数据库也要做校验。
例如下面 接收的参数属性拷贝到user对象后, 如果又设置了userName为null,那么保存插入的数据就会有问题。
@PostMapping
public UserInfo create(@RequestBody @Validated UserInfo info){
User user=new User();
BeanUtils.copyProperties(info,user);
user.setUsername(null);
userRepository.save(user);
info.setId(user.getId());
return info;
}
再次测试,用户名和密码都填好后。
返回的500,。是服务器内部处理的错误
{ "timestamp": "2019-12-11T08:47:21.469+0000", "status": 500, "error": "Internal Server Error", "message": "Validation failed for classes [com.imooc.security.user.User] during persist time for groups [javax.validation.groups.Default, ]\\nList of constraint violations:[\\n\\tConstraintViolationImpl{interpolatedMessage=\'用户名不能为null\', propertyPath=username, rootBeanClass=class com.imooc.security.user.User, messageTemplate=\'用户名不能为null\'}\\n]", "path": "/users" }
用户名不能重复的问题、@Column注解里面。unique注解
数据库内把表的username删除掉。SpringBoot的项目启动后,JPA会自动同步 User类的字段到数据库内。发现缺少了username字段,就创建上。
JPA会自动同步你的对象和数据库的表,但是他会去做判断,如果你的数据库内已经有了一个同名的字段username,他就不会再去改变数据库已有的字段。我们把username删掉了 他会重新去创建这个字段,并按照实体类的规则去创建。
启动服务。日志内去创建了username这个字段。
保证用户名的唯一性。
把数据库库内的数据清理一下 ,剩下一条用户数据
把设置为空的这行代码删掉,。
{ "timestamp": "2019-12-11T08:56:55.356+0000", "status": 500, "error": "Internal Server Error", "message": "could not execute statement; SQL [n/a]; constraint [UK_sb8bbouer5wak8vyiiy4pf2bx]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement", "path": "/users" }
这个就是数据库的常见的校验
@NotBlank和nullable设置为true这两个的区别。
@NotBlank这是应用级,框架层面的校验,不管你数据库底层数据库字段是空的还是非空的,在应用层面他都回去做校验。sql执行之前去做校验。
@Column的nullable是在建数据库的时候,把这列设置为非空了。就是数据库内这个字段不能为空
如果去掉了nullable那么数据库内是可为空的。只不过NotBlank会在框架层面去校验非空
结束
以上是关于Spring cloud微服务安全实战-3-6API安全机制之数据校验_batch的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud微服务安全实战_6-1_微服务之间的通讯安全之概述
Spring cloud微服务安全实战-4-4 OAuth2协议与微服务安全