• JSD-2204-酷莎商城(管理员模块)-密码加密-Day10


    1.酷莎商城(管理员模块)

    1.1完成项目的基本配置

    application.properties重命名为application.yml,并另外创建application-dev.yml

    application.yml中添加配置:

    1. # 激活Profile配置
    2. # 指定Mybatis的XML文件的位置
    3. # 响应JSON时不包含为null的属性
    4. # 开启Knife4j的增强模式

    application-dev.yml中添加配置:

    1. # 指定服务端口
    2. # 配置连接数据库的参数
    3. # 日志显示级别

    在根包下创建config.MybatisConfiguration配置类,在此配置类上添加@MapperScan以配置接口所在的包(此包尚且不存在,可以此时就把包也创建出来)。

    在根包下创建config.Knife4jConfiguration配置类,注意,此类中需要调整控制器类所在的包(此包尚且不存在,可以此时就把包也创建出来)。

    在根包下创建config.WebMvcConfiguration配置类,实现WebMvcConfigurer接口,重写addCorsMappings()方法,以解决跨域访问的问题(此问题尚未出现,但可提前完成此项配置)。

    完成以上配置后,应该在src/test/java下找到默认的配置类,执行其中的contextLoads()方法,此方法的方法体是空的,理应通过测试!

    继续在测试类中添加方法,尝试连接数据库,以检查以上配置的“连接数据库的参数”是否正确:

    1. @Autowired
    2. DataSource dataSource; // 导包时注意:此接口是javax.sql包中的
    3. @Test
    4. void testConnection() throws Throwable {
    5. dataSource.getConnection();
    6. }

    接下来,将此前项目中的“Mybatis拦截器(用于解决gmt_creategmt_modified的)”复制到当前项目中,并在MybatisConfiguration中添加配置。

    完成后,再次执行以上测试,确保新增代码后仍能够正常通过测试。

    1.2添加管理员

    1.2.1持久层

    创建pojo.entity.Admin类,类的属性与ams_admin表保持一致。

    在根包下创建mapper.AdminMapper接口,并在接口中添加抽象方法:

    int insert(Admin admin);
    

    为了保证后续登录时使用的“用户名”是唯一的,在插入数据之前,还需要检查“此用户名是否已经存在”,则需要实现查询功能:

    int countByUsername(String username);
    

    src/main/resources/mapper下,通过粘贴得到AdminMapper.xml,在此文件中配置以上2个抽象方法映射的SQL语句:

    1. <mapper namespace="AdminMapper接口的全限定名">
    2. <insert id="insert" useGeneratedKey="true" keyProperty="id">
    3. 插入管理员数据的SQL语句,不需要处理gmt_create和gmt_modified
    4. insert>
    5. <select id="countByUsername" resultType="int">
    6. 根据用户名统计数量的SQL语句
    7. select>
    8. mapper>

    src/test/java下的根包下,创建mapper.AdminMapperTests测试类,在此类中自动装配AdminMapper对象,并测试以上2个方法:

    1. package cn.tedu.csmall.passport.mapper;
    2. import cn.tedu.csmall.passport.pojo.entity.Admin;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.junit.jupiter.api.Test;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.boot.test.context.SpringBootTest;
    7. @SpringBootTest
    8. @Slf4j
    9. public class AdminMapperTests {
    10. @Autowired
    11. AdminMapper mapper;
    12. @Test
    13. void testInsert() {
    14. Admin admin = new Admin();
    15. admin.setUsername("test-admin-001");
    16. admin.setPassword("123456");
    17. log.debug("插入数据之前,参数={}", admin);
    18. int rows = mapper.insert(admin);
    19. log.debug("插入数据完成,受影响的行数={}", rows);
    20. log.debug("插入数据之后,参数={}", admin);
    21. }
    22. @Test
    23. void testCountByUsername() {
    24. String username = "test-admin-007";
    25. int count = mapper.countByUsername(username);
    26. log.debug("根据用户名【{}】统计,数量={}", username, count);
    27. }
    28. }

    1.2.2业务逻辑层

    关于业务接口

    在根包下创建pojo.dto.AdminAddNewDTO类,在此类中添加”添加管理员时需要提交的请求参数“,包括:usernamepasswordnicknameavatarphoneemaildescriptionenable

    在根包下创建service.IAdminService接口,并在此接口中添加”添加管理员“的抽象方法:

    1. public interface IAdminService {
    2. void addNew(AdminAddNewDTO adminAddNewDTO);
    3. }

    关于业务实现类

    在根包下创建web.ServiceCode接口,此接口可参考此前项目中的同名接口。

    在根包下创建ex.ServiceException,此异常类可参考此前项目中的同名异常类。

    在根包下创建service.impl.AdminServiceImpl类,实现以上IAdminService接口,添加@Service注解,并在类中自动装配AdminMapper对象。

    关于重写的方法:

    1. @Override
    2. public void addNew(AdminAddNewDTO adminAddNewDTO) {
    3. // 日志
    4. // 从参数中获取尝试添加的管理员的用户名
    5. // 调用adminMapper对象的countByUsername()方法进行统计
    6. // 判断统计结果是否大于0
    7. // 是:日志,抛出ServiceException
    8. // 创建新的Admin对象
    9. // 调用BeanUtils.copyProperties()方法将参数的属性值复制到以上Admin对象中
    10. // 补全Admin对象的属性值:loginCount >>> 0
    11. // 日志
    12. // 调用adminMapper对象的insert()方法插入数据,并获取返回的受影响的行数
    13. // 判断受影响的行数是否不等于1
    14. // 是:日志,抛出ServiceException
    15. }

    编写并执行测试

    src/test/java下的根包下,创建service.AdminServiceTests测试,在此类中测试以上方法:

    1. package cn.tedu.csmall.passport.service;
    2. import cn.tedu.csmall.passport.ex.ServiceException;
    3. import cn.tedu.csmall.passport.pojo.dto.AdminAddNewDTO;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.junit.jupiter.api.Test;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.boot.test.context.SpringBootTest;
    8. @Slf4j
    9. @SpringBootTest
    10. public class AdminServiceTests {
    11. @Autowired
    12. IAdminService service;
    13. @Test
    14. void testAddNew() {
    15. AdminAddNewDTO adminAddNewDTO = new AdminAddNewDTO();
    16. adminAddNewDTO.setUsername("test-admin-005");
    17. adminAddNewDTO.setPassword("12345678");
    18. try {
    19. service.addNew(adminAddNewDTO);
    20. log.debug("添加管理员成功!");
    21. } catch (ServiceException e) {
    22. log.debug(e.getMessage());
    23. }
    24. }
    25. }

    1.2.3控制器层

    在根包下创建web.JsonResult类,可参考此前项目中的同名类。

    在根包下创建controller.AdminController类,在类上添加@RequestMapping("/admins")@RestController注解,并在类中自动装配IAdminService对象。

    在类中添加处理请求的方法:

    1. @PostMapping("/add-new")
    2. public JsonResult addNew(AdminAddNewDTO adminAddNewDTO) {
    3. // 日志
    4. // 调用Service对象实现添加
    5. // 返回
    6. }

    完成后,启动项目,可通过Knife4j的调试功能测试添加管理员,当添加成功时,将响应{ "state": 20000 },当添加失败时(用户名已被占用),会出现500错误。

    在根包下创建ex.handler.GlobalExceptionHandler,可参考此前项目中的同名类。

    完成后,再次启动项目,再次通过Knife4j的调试功能测试添加管理员,当添加失败时(用户名已被占用),将响应{ "state": 40900, "message": "xxxx" }

    接下来,还可以在AdminControllerAdminAddNewDTO中添加相关注解,使得Knife4j文档更加易于阅读。

    另外,还可以基于Spring Validation对请求参数进行检查。

    1.3前端页面

    先创建AdminAddNewView.vue视图,并在router/index.js中添加配置,其路径应该是/sys-admin/temp/admin/add-new,完成后,通过 `http://localhost:8888/sys-admin/temp/admin/add-new`可以访问到此页面。

    HomeView的菜单中,添加对应的菜单项,以确定点击菜单项可以打开此页面。

    BrandAddNewView中的代码全部复制到AdminAddNewView中,先调整输入框的数量,并修改显示在网页中的文字信息,例如标题、输入框的提示等,然后调整各输入框的设计中的属性名,并同步修改JavaScript中ruleForm的属性,然后,按需设计验证规则。

    最后,调整使用axios发请求的部分代码,需要修改url的值,和输出、日志等位置的文本。

    2.密码加密

    存储到数据库中的密码,必须经过加密处理!

    用户提交的原始密码通常称之为原文、明文,加密后的数据通常称之为密文。

    对于需要存储到数据库中的密码,不可以使用加密算法!

    提示:加密算法是用于保障传输过程安全的,并不是用于保障存储的数据的安全的!

    通常,会使用消息摘要算法对密码进行加密处理!

    消息摘要算法典型的特征是:

    • 不可逆向运算
    • 消息相同时,得到摘要是相同的
    • 使用同样的算法,无论消息的长度是多少,摘要的长度是固定的
    • 消息不同时,得到的摘要几乎不会相同

    典型的消息摘要算法是:

    • MD(Message Digest)系列
      • MD1 / MD2 /MD5
    • SHA(Secure Hash Algorithm)家族
      • SHA-1 / SHA-256 / SHA-384 / SHA-512

    MD系列算法都是128位算法,即其运算结果是128个二进制位。

    SHA-1是160位算法(已被破解),SHA-256是256算法,SHA-384是384位算法,SHA-512是512位算法。

    关于处理密码加密,应该:

    • 要求用户使用安全强度更高的密码
    • 加盐
    • 多重加密(循环)
    • 使用位数更长的算法
    • 综合以上应用方式
    1. package cn.tedu.csmall.passport;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.junit.jupiter.api.Test;
    4. import org.springframework.util.DigestUtils;
    5. import java.util.UUID;
    6. @Slf4j
    7. public class Md5Tests {
    8. @Test
    9. public void testMd5() {
    10. for (int i = 0; i < 10; i++) {
    11. String rawPassword = "123456";
    12. String salt = UUID.randomUUID().toString();
    13. String encodedPassword = DigestUtils.md5DigestAsHex(
    14. (salt + rawPassword + salt + rawPassword + salt).getBytes());
    15. // 123456abvckj,fsd789u4rkjldsiu
    16. log.debug("原文={}, 密文={}", rawPassword, encodedPassword + salt.replaceAll("-", ""));
    17. // 原文=123456, 密文=e10adc3949ba59abbe56e057f20f883e
    18. // 0 >> xx
    19. // 1 >> xx
    20. }
    21. }
    22. }

  • 相关阅读:
    java基于ssm的奶牛场电子自动化管理系统
    stash拯救犹豫不决的commit
    封装微信小程序隐私信息授权
    基于多时间尺度滚动优化的多能源微网双层调度研究(Matlab代码实现)
    hdfs分布式文件系统 默认数据存放路径、及相关配置属性详细解析
    Linux(多用户下)查看cuda、cudnn版本、查看已经安装的cuda版本相关命令
    Redis数据类型之list
    线上数据问题排查案例分享-因为 HMS 和底层 orc 文件中某字段的数据精度不一致造成的数据丢失问题
    优化软件测试成本的 7 个步骤
    3.1 首页功能的开发-跳转到首页
  • 原文地址:https://blog.csdn.net/TheNewSystrm/article/details/126164851