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;
}