SecureUtil.sha256密码加密并对接前端11.22

一、使用SecureUtil.sha256加密给用户设置密码

/**
* 检测用户密码是否正确
*
* @param account  账号
* @param password 密码
* @return 用户信息
*/
protected R<User> getUser(String account, String password) {
    User user = this.userService.getByAccount(account, true);
    // 密码错误
    if (user == null) {
        return R.fail(ExceptionCode.JWT_USER_INVALID);//用户名或密码错误
    }

    // 方便开发、测试、演示环境 开发者登录别人的账号,生产环境禁用。
    if (!systemProperties.getVerifyPassword()) {
        return R.success(user);
    }

    String passwordMd5 = SecureUtil.sha256(password + user.getSalt());
    if (!passwordMd5.equalsIgnoreCase(user.getPassword())) {
        String msg = "用户名或密码错误!";
        // 密码错误事件
        SpringUtils.publishEvent(new LoginEvent(LoginStatusDTO.pwdError(user.getId(), msg)));
        return R.fail(msg);
    }

    // 密码过期
    if (user.getPasswordExpireTime() != null && LocalDateTime.now().isAfter(user.getPasswordExpireTime())) {
        String msg = "用户密码已过期,请修改密码或者联系管理员重置!";
        SpringUtils.publishEvent(new LoginEvent(LoginStatusDTO.fail(user.getId(), msg)));
        return R.fail(msg);
    }

    if (!user.getState()) {
        String msg = "用户被禁用,请联系管理员!";
        SpringUtils.publishEvent(new LoginEvent(LoginStatusDTO.fail(user.getId(), msg)));
        return R.fail(msg);
    }

    // 用户锁定
    Integer maxPasswordErrorNum = systemProperties.getMaxPasswordErrorNum();
    Integer passwordErrorNum = Convert.toInt(user.getPasswordErrorNum(), 0);
    if (maxPasswordErrorNum > 0 && passwordErrorNum >= maxPasswordErrorNum) {
        log.info("[{}][{}], 输错密码次数:{}, 最大限制次数:{}", user.getName(), user.getId(), passwordErrorNum, maxPasswordErrorNum);

        LocalDateTime passwordErrorLockTime = DateUtils.conversionDateTime(systemProperties.getPasswordErrorLockUserTime());
        log.info("passwordErrorLockTime={}", passwordErrorLockTime);
        if (passwordErrorLockTime.isAfter(user.getPasswordErrorLastTime())) {
            // 登录失败事件
            String msg = StrUtil.format("密码连续输错次数已达到{}次,用户已被锁定~", maxPasswordErrorNum);
            SpringUtils.publishEvent(new LoginEvent(LoginStatusDTO.fail(user.getId(), msg)));
            return R.fail(msg);
        }
    }
    return R.success(user);
}

各项常量定义:


给前端写的密码加盐工具


public class PasswordDeme {
    public static void main(String[] args) {
        String password="123456";
        String salt="4rts1x9cc2v1452wrv78r";
        String passwordMd5 = SecureUtil.sha256(password + salt);
        System.out.println(passwordMd5);//存于数据库即可
    }
}

二、对接前端

现在开发中,前端不小心把管理员账号密码试错达到10次被锁住了,来问我解决

找到对应后端代码:

// 用户锁定
Integer maxPasswordErrorNum = systemProperties.getMaxPasswordErrorNum();
Integer passwordErrorNum = Convert.toInt(user.getPasswordErrorNum(), 0);
if (maxPasswordErrorNum > 0 && passwordErrorNum >= maxPasswordErrorNum) {
    log.info("[{}][{}], 输错密码次数:{}, 最大限制次数:{}", user.getName(), user.getId(), passwordErrorNum, maxPasswordErrorNum);

    LocalDateTime passwordErrorLockTime = DateUtils.conversionDateTime(systemProperties.getPasswordErrorLockUserTime());
    log.info("passwordErrorLockTime={}", passwordErrorLockTime);
    if (passwordErrorLockTime.isAfter(user.getPasswordErrorLastTime())) {
        // 登录失败事件
        String msg = StrUtil.format("密码连续输错次数已达到{}次,用户已被锁定~", maxPasswordErrorNum);
        SpringUtils.publishEvent(new LoginEvent(LoginStatusDTO.fail(user.getId(), msg)));
        return R.fail(msg);
    }
}

 找到最大允许密码错误次数设置

/**
 * 密码错误次数
 */
@ApiModelProperty(value = "密码错误次数")
@TableField("password_error_num")
private Integer passwordErrorNum;

 先改个100吧,方便前端测试使用,后期上线记得改回来

三、记个小东西

 报这个错就是当前服务debug和run同时启动了,端口冲突

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值