持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
用户注册实现密码加密
(一)注册接口
1.在前面的课程中,我们成功了把用户注册接口实现了,密码是明文
如果我们的数据库数据泄漏,用户账户和密码都暴露了,对系统产生非常大的影响,因此我们有必要对密码进行加密(md5密码破解网站www.cmd5.com/)
2.MD5加密处理
2.1新建Constant
public class Constant {
public static final String SALT = "12fdas[fsd]";
}
代码说明:
- SALT:盐值(写得越复杂越好,不容易被破解)
2.1 新建util包
新建MD5Utils文件
package com.imooc.mall.util;
import com.imooc.mall.common.Constant;
import org.apache.tomcat.util.codec.binary.Base64;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static String getMD5Str(String strValue) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
return Base64.encodeBase64String(md5.digest((strValue+ Constant.SALT).getBytes()));
}
//测试方法
public static void main(String args[]) throws NoSuchAlgorithmException {
String str = getMD5Str("123");
System.out.println(str);
}
}
3.注册实现类修改密码
4.重启项目,调用注册接口
我们发现用户的密码就变复杂了,不好破解了
(二)登陆接口
1.控制器新增login方法
@PostMapping("login")
@ResponseBody
public ApiRestResponse login(@RequestParam("userName") String userName, @RequestParam("password") String password, HttpSession session) throws ImoocMallException {
if(StringUtils.isEmpty(userName)){
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
}
if(StringUtils.isEmpty(password)){
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
}
User user = userService.login(userName,password);
user.setPassword(null);
session.setAttribute(Constant.IMOOC_MALL_USER,user);
return ApiRestResponse.success(user);
}
代码说明:
- userService.login(userName,password);:调用userService的login接口,用来查询登陆的用户信息
- session.setAttribute(Constant.IMOOC_MALL_USER,user);:利用session存储user信息
2.新增常量
public static final String IMOOC_MALL_USER = "imooc_mall_user";
3.接口类定义login方法
User login(String userName, String password) throws ImoocMallException;
4.实现类UserService实现login方法
@Override
public User login(String userName, String password) throws ImoocMallException {
String md5Password =null;
try {
md5Password= MD5Utils.getMD5Str(password);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
User user = userMapper.selectLogin(userName,md5Password);
if(user==null){
throw new ImoocMallException(ImoocMallExceptionEnum.WRONG_PASSWORD);
}
return user;
}
代码说明:
- userMapper.selectLogin(userName,md5Password);:通过selectLogin查询出用户名和密码在数据库中是否匹配正确
- ImoocMallExceptionEnum.WRONG_PASSWORD:抛出用户密码错误异常
5.枚举类定义错误码
WRONG_PASSWORD(10006,"密码错误"),
6.dao包下的UserMapper定义selectLogin方法
User selectLogin(@Param("userName") String userName, @Param("password") String password);
代码说明:
- 这边要注意,如果是两个参数,一定要使用@Param("字段名"),不然会包异常,找不到参数
7.userMapper定义查询语句
<select id="selectLogin" parameterType="map" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List"></include>
from imooc_mall_user
where username=#{userName,jdbcType=VARCHAR}
and password = #{password}
</select>
8.重启项目
到这里,我们的登陆接口完成了