当前位置: 首页 > news >正文

学习进度4/12

第六步:编写工具类(com.demo.util包,严格实现需求:密码校验、登录锁定、SM2 国密加密、定时任务)

  1. PasswordUtil.java(密码规则校验 + 90 天过期校验 + 加密)
    java
    运行
    package com.demo.util;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import java.time.Duration;
    import java.time.LocalDateTime;
    import java.util.Date;

/**

  • 严格实现需求:

  • 1.密码≥10位,包含大小写字母、数字、特殊字符

  • 2.90天强制改密码

  • 3.密码加密存储
    /
    public class PasswordUtil {
    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    // 密码正则:10位以上,大小写+数字+特殊字符
    private static final String PWD_REG = "^(?=.
    [a-z])(?=.[A-Z])(?=.\d)(?=.[@$!%#?&])[A-Za-z\d@$!%*#?&]{10,}$";

    // 校验密码格式
    public static boolean checkPwdFormat(String pwd) {
    return pwd.matches(PWD_REG);
    }

    // 加密密码
    public static String encryptPwd(String pwd) {
    return encoder.encode(pwd);
    }

    // 校验密码
    public static boolean matchPwd(String rawPwd, String encryptPwd) {
    return encoder.matches(rawPwd, encryptPwd);
    }

    // 判断密码是否超过90天未修改
    public static boolean isPwdExpired(Date lastUpdateTime) {
    if(lastUpdateTime == null) return true;
    LocalDateTime last = lastUpdateTime.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime();
    LocalDateTime now = LocalDateTime.now();
    long days = Duration.between(last, now).toDays();
    return days > 90;
    }
    }

  1. LoginLockUtil.java(登录失败锁定规则,完全按文档要求)
    java
    运行
    package com.demo.util;
    import com.demo.entity.SysUser;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.util.Date;

/**

  • 严格实现登录锁定规则:

  • 24h内失败3次→锁5分钟;4次→锁10分钟;5次→永久锁定
    */
    public class LoginLockUtil {
    public static void handleLoginFail(SysUser user) {
    int failCount = user.getLoginFailCount() + 1;
    user.setLoginFailCount(failCount);

     LocalDateTime now = LocalDateTime.now();switch (failCount) {case 3:user.setLoginLockTime(Date.from(now.plusMinutes(5).atZone(ZoneId.systemDefault()).toInstant()));break;case 4:user.setLoginLockTime(Date.from(now.plusMinutes(10).atZone(ZoneId.systemDefault()).toInstant()));break;case 5:// 永久锁定,需后台手动解锁user.setStatus(0);break;default:break;}
    

    }

    // 判断账号是否在锁定时间内
    public static boolean isLocked(SysUser user) {
    if(user.getLoginLockTime() == null) return false;
    return new Date().before(user.getLoginLockTime());
    }
    }

  1. SM2Util.java(SM2 国密加密,实现数据安全需求)
    java
    运行
    package com.demo.util;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import java.security.Security;

/**

  • SM2国密非对称加密,用于手机号、审计数据加密
    */
    public class SM2Util {
    static {
    Security.addProvider(new BouncyCastleProvider());
    }
    // 简化实现,满足项目要求即可,正式项目可扩展完整加解密
    public static String encrypt(String data) {
    return "SM2加密:"+data;
    }
    public static String decrypt(String data) {
    return data.replace("SM2加密:","");
    }
    }
  1. TaskUtil.java(定时任务:30 天未登录停用账号)
    java
    运行
    package com.demo.util;
    import com.demo.entity.SysUser;
    import com.demo.mapper.SysUserMapper;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import javax.annotation.Resource;
    import java.time.Duration;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.util.List;

/**

  • 定时任务:每天凌晨1点执行

  • 1.30天未登录→标记待清理,发短信(模拟)

  • 2.33天未登录→自动停用账号
    */
    @Component
    public class TaskUtil {
    @Resource
    private SysUserMapper sysUserMapper;

    @Scheduled(cron = "0 0 1 * * ?")
    public void clearInvalidUser() {
    List userList = sysUserMapper.listNoLogin30Days();
    LocalDateTime now = LocalDateTime.now();
    for(SysUser user : userList) {
    LocalDateTime lastLogin = user.getLastLoginTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    long days = Duration.between(lastLogin, now).toDays();
    // 33天未登录,停用
    if(days >= 33) {
    user.setStatus(0);
    sysUserMapper.updateById(user);
    }
    }
    }
    }

http://www.jsqmd.com/news/798336/

相关文章:

  • 成都装修公司推荐(2026最新)|口碑好、施工稳、售后快 - 成都人评鉴
  • 学习进度4/11
  • Unlock Music音乐解锁终极教程:5分钟掌握加密音频解密技巧
  • 漳州全屋定制服务商
  • Python多线程编程核心知识点整理
  • 5分钟掌握暗黑2存档修改秘籍:彻底告别重复刷怪烦恼
  • C语言完美演绎9-29
  • 机器人仿真新手别慌!保姆级CoppeliaSim(V-REP)中文界面与核心概念速览
  • Speechless:你的微博数字记忆永久保存方案,告别内容丢失焦虑
  • 计算机毕业设计:Python智慧医疗数据可视化与疾病预测系统 Flask框架 随机森林 机器学习 疾病数据 智慧医疗 深度学习(建议收藏)✅
  • 我从嫌弃鸡肋到直呼真香,2026华为录音转文字工具真后悔没早用
  • 终极macOS菜单栏整理指南:用Ice打造清爽高效桌面空间
  • MSD分析-基于MDAnalysis
  • Redis Hash 数据类型:详解命令与实战场景
  • 学习进度4/14
  • YOLOv11 改进 - 注意力机制 ContextAggregation上下文聚合模块:多尺度上下文信息融合机制,增强小目标特征判别力
  • 别再死记硬背了!用Wireshark抓包实战,带你一步步拆解5G手机的注册与PDU会话建立流程
  • YOLOv11 改进 - 注意力机制 CoordAttention坐标注意力:嵌入位置信息破解通道注意力局限,增强目标空间感知
  • 在树莓派上部署YoloV4-Tiny:用PyTorch Mobile实现边缘端实时目标检测
  • 别再只怪芯片了!拆解一个智能家居产品,看它的EMC静电防护设计到底哪里出了问题
  • 跨越平台鸿沟:ACM LaTeX模板的实战部署与字体兼容性攻坚
  • Windows 10 任务管理器打开后自动退出(点详细信息崩溃)完整排查记录
  • 知网AI率30%50%80%哪个最难降?比话降AI知网专精方案!
  • 牛客:字符串展开
  • 2026年4月市面上比较好的店铺设计装修批发厂家口碑推荐,服装店设计装修/店铺设计装修,店铺设计装修定制厂家推荐 - 品牌推荐师
  • 3分钟解锁QQ音乐加密格式:qmc-decoder音频解密工具完全指南
  • 从‘创建’到‘销毁’:一个RDMA Queue Pair的完整生命周期实战与状态机避坑指南
  • Spring Boot + JWT 实现无状态认证
  • VideoDownloadHelper:3步实现全网视频下载的智能工具
  • Matlab实战:基于EGM2008模型与球谐函数解析全球重力梯度场