Spring Boot电商项目(八)

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

用户注册实现密码加密

(一)注册接口

1.在前面的课程中,我们成功了把用户注册接口实现了,密码是明文

image.png 如果我们的数据库数据泄漏,用户账户和密码都暴露了,对系统产生非常大的影响,因此我们有必要对密码进行加密(md5密码破解网站www.cmd5.com/)

2.MD5加密处理

2.1新建Constant

image.png

public class Constant {
    public static final String SALT = "12fdas[fsd]";

}

代码说明:

  • SALT:盐值(写得越复杂越好,不容易被破解)

2.1 新建util包

新建MD5Utils文件 image.png

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.注册实现类修改密码

image.png

4.重启项目,调用注册接口

image.png 我们发现用户的密码就变复杂了,不好破解了

(二)登陆接口

1.控制器新增login方法

image.png

@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";

image.png

3.接口类定义login方法

User login(String userName, String password) throws ImoocMallException;

image.png

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;

}

image.png 代码说明:

  • userMapper.selectLogin(userName,md5Password);:通过selectLogin查询出用户名和密码在数据库中是否匹配正确
  • ImoocMallExceptionEnum.WRONG_PASSWORD:抛出用户密码错误异常

5.枚举类定义错误码

WRONG_PASSWORD(10006,"密码错误"),

image.png

6.dao包下的UserMapper定义selectLogin方法

User selectLogin(@Param("userName")  String userName, @Param("password") String password);

image.png 代码说明:

  • 这边要注意,如果是两个参数,一定要使用@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>

image.png

8.重启项目

image.png 到这里,我们的登陆接口完成了