一、使用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同时启动了,端口冲突