zoukankan      html  css  js  c++  java
  • Spring cloud微服务安全实战-3-6API安全机制之数据校验




    校验:非空、唯一性等校验
    密码的加密:密码加密来存储。
    如何做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, ]
    List of constraint violations:[
    	ConstraintViolationImpl{interpolatedMessage='用户名不能为null', propertyPath=username, rootBeanClass=class com.imooc.security.user.User, messageTemplate='用户名不能为null'}
    ]",
        "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会在框架层面去校验非空

     

    结束

  • 相关阅读:
    C语言 exit 函数 C语言零基础入门教程
    C/C++ getchar函数 C语言零基础入门教程
    自己动手重新实现LINQ to Objects: 7 Count和LongCount
    自己动手重新实现LINQ to Objects: 5 Empty
    自己动手重新实现LINQ to Objects: 8 Concat
    自己动手重新实现LINQ to Objects: 11 First,Last,Single以及它们带有OrDefault的重载
    自己动手重新实现LINQ to Objects: 3 Select
    自己动手重新实现LINQ to Objects: 2 Where
    自己动手重新实现LINQ to Objects: 10 Any和All
    用豆瓣读书Chrome插件,简单购买电子书
  • 原文地址:https://www.cnblogs.com/wangjunwei/p/11904309.html
Copyright © 2011-2022 走看看