Spring cloud微服务安全实战-3-6API安全机制之数据校验
校验:非空、唯一性等校验
密码的加密:密码加密来存储。
如何做https的访问
校验
一个层面是接口层面,另外一个层面是数据库层面。
Springboot给我们提供了简单的封装
校验的包里面还有其他的注解。
IDEA里面鼠标选中按住Ctrl键盘直接跳到注解的包下面
然后在参数之前加上注解。@Validated 表示传进来的这个UserInfo需要去做校验
运行程序查看效果
详细的错误信息
用户名和密码都去掉
返回的errors就是一个数组
{
"timestamp": "2019-12-11T08:34:27.894+0000",
"status": ,
"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": ,
"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": ,
"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安全机制之数据校验的更多相关文章
- Spring cloud微服务安全实战-3-4 API安全机制之认证(1)
本节开始讲认证相关的东西.注意事项,出现问题的对应的解决方案. 先写用户注册的服务,注册一些用户信息进去.注册也是我们安全体系的一部分 注册 UserController里面的create方法 先修改 ...
- Spring cloud微服务安全实战-3-3 API安全机制之流控
首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...
- Spring cloud微服务安全实战-3-5 API安全机制之认证(2)
基于Http协议的认证方式有很多.本节我们只讲一个最简单的HttpBasic认证.聪明就可以看出来,这是一个最基础的认证,好处是简单方便,所有的主流浏览器都支持,问题就是并不是非常安全的,但是帮我们大 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
随机推荐
- canvans知识点
1.绘制圆的角度示意图: 2 倒计时中,时钟数字的渲染逻辑: 3 直线边缘样式的设置 context.lineCap = "butt"; context.lineCap = &qu ...
- oracle+mybatis报错:BindingException("Invalid bound statement (not found): ")
oracle+mybatis报错:BindingException("Invalid bound statement (not found): ") 从mysql转到oracle数 ...
- log4j+junit+maven
本文在开发第一个maven示例的基础上进行扩展. 日志级别测试 在src\main\resources文件夹下新建log4j.properties log4j.rootLogger = warn,st ...
- TCPDUMP抓包学习
一.抓包基础 1.抓网卡ens33 的包,有多大抓多大,然后保存到a.cap中 [root@localhost ~]# tcpdump -i ens33 -s -w a.cap tcpdump: li ...
- 【转发】c#做端口转发程序支持正向连接和反向链接
可以通过中转server来连接sql server,连接的时候用ip,port,不是冒号,是逗号 但试过local port 21想连接AS400的FTP却不成功...为咩涅... https://w ...
- AGC 030 B - Tree Burning 结论+枚举
考试 T2,是一个脑筋急转弯. 最暴力的贪心是每次先选左,再选右,再选左..... 然而这么做在一些情况下是错的. 但是,我们发现我们的选法一定是 $LLLLRLRLRLRLR$ 或 $RRRRLRL ...
- Optimize Cube.js Performance with Pre-Aggregations
转自:https://cube.dev/blog/high-performance-data-analytics-with-cubejs-pre-aggregations/ 可以了解 Pre-Aggr ...
- 洛谷P1650赛马与codevs 2181 田忌赛马
洛谷P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负 ...
- GSS3 C - Can you answer these queries III
//在gss1的基础上加了修改操作,一样的做法,加一个modify函数就可以了 #include<iostream> #include<cstdio> #include< ...
- Android中进度条
<ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent&quo ...