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, ]\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會在框架層面去校驗非空

 

結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM