1. 程式人生 > 其它 >Spring Boot+Security使用BCryptPasswordEncoder加密使用者登入密碼

Spring Boot+Security使用BCryptPasswordEncoder加密使用者登入密碼

技術標籤:spring bootspringbootsecurity加密解密

BCryptPasswordEncoder的具體介紹我就不多說了,網上到處都是,比如這個:
BCryptPasswordEncoder加密、驗證策略
我這裡就是記錄一下怎麼用。

因為它是基於Security的,所以在使用之前,需要在pom.xml匯入依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</
artifactId
>
</dependency>

重新整理一下maven,然後就可以用了

為了在使用的時候不麻煩,先定義一個工具類

package com.example.yuyun.security.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 安全服務工具類
 * @Author HeYunHui
 * @create 2021/1/11 1:32
 */
public class SecurityUtils {
    /**
     * 生成BCryptPasswordEncoder密碼
     * @param password 密碼
     * @return 加密字串
     */
public static String encodePassword(String password) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); return passwordEncoder.encode(password); } /** * 判斷密碼是否相同 * @param rawPassword 真實密碼 * @param encodedPassword 加密後字元 * @return 結果 */
public static boolean matchesPassword(String rawPassword, String encodedPassword) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); return passwordEncoder.matches(rawPassword, encodedPassword); } }

1、加密

SecurityUtils.encodePassword("密碼")

如:我在註冊時對使用者輸入的密碼進行加密:

@PostMapping("register")
@ResponseBody
public HashMap register(@RequestBody Users users) throws Exception{
    HashMap m = new HashMap();
    try {
        /** encode()加密 */
        users.setUserPwd(SecurityUtils.encodePassword(users.getUserPwd()));
        Boolean u=userService.insertUsers(users);
        if (u==true){
            m.put("code", String.valueOf(HttpStatus.SUCCESS));
            m.put("msg","註冊成功");
        }else {
            m.put("msg","error");
        }

    } catch (Exception e) {
        e.printStackTrace();
        m.put("msg","error");
    }
    return m;
}

加密了之後,資料庫中儲存的密碼就變成了密文
在這裡插入圖片描述

2、解密
那加密之後如何解密呢?

使用BCryptPasswordEncoder加密之後,沒有解密之說,只能對密碼進行驗證,也就是

將資料庫儲存的加密密碼與使用者輸入的密碼比較

返回值為true,則密碼輸入正確,登入成功;返回false,密碼錯誤

驗證密碼:

SecurityUtils.matchesPassword("使用者輸入的密碼","資料庫中儲存的密碼")

在登入中:

@PostMapping("login")
@ResponseBody
public HashMap<String,String> login(
        @RequestBody User user) throws IOException {
    HashMap hashMap=new HashMap(10);
    try {
    	/** 先根據使用者輸入的使用者名稱查詢資料 */
        Users u=userService.findPwdByName(user.getUserName());
        /** matchesPassword()驗證使用者輸入密碼和資料庫加密密碼是否一致 */
        if(u!=null&& SecurityUtils.matchesPassword(user.getUserPwd(),u.getUserPwd())){
            hashMap.put("code", String.valueOf(HttpStatus.SUCCESS));
            hashMap.put("msg","登入成功");
        }
        else {
            hashMap.put("msg","使用者名稱或密碼錯誤");
        }
    } catch (Exception e) {
        e.printStackTrace();
        hashMap.put("msg","error");
    }
    return hashMap;
}