public String ChangePassword(UserInfo userInfo){ if(userInfo.getPassword().equals(userInfo.getNewPassword())){ throw new RuntimeException("新密码不能与旧密码相同"); } User user = selectUserByPhone(User.builder().phoneNumber(userInfo.getUsername()).build()); if (user == null || !user.getPassword().equals(userInfo.getPassword())) { throw new RuntimeException("账号或密码不正确"); } if(validatePassword(userInfo.getPassword())){ user.setPassword(userInfo.getNewPassword()); userInfoMapper.updateByPrimaryKeySelective(user); return "修改密码成功"; } else { throw new RuntimeException("密码格式不正确"); } }代码优化
时间: 2024-03-21 10:41:41 浏览: 107
以下是对该方法的优化建议:
1. 将 `RuntimeException` 替换为具体的业务异常,例如 `InvalidPasswordException`、`UserNotFoundException` 等等,方便调用者捕获并处理异常。
2. 将密码的校验逻辑分离出来,并抽象为一个 `PasswordValidator` 接口,让其具体实现类负责验证不同的密码规则。
3. 在 `User` 对象中添加一个 `changePassword(String newPassword)` 方法,用于修改密码并对密码进行加密存储,避免出现明文密码存储的安全问题。
以下是优化后的代码:
```
public interface PasswordValidator {
boolean validate(String password);
}
public class DefaultPasswordValidator implements PasswordValidator {
@Override
public boolean validate(String password) {
// 根据具体需求进行密码校验
return password.length() >= 8 && password.matches(".*\\d.*");
}
}
public class User {
// 省略其他属性
public void changePassword(String newPassword, PasswordValidator validator) {
if (getPassword().equals(newPassword)) {
throw new InvalidPasswordException("新密码不能与旧密码相同");
}
if (!validator.validate(newPassword)) {
throw new InvalidPasswordException("密码格式不正确");
}
setPassword(encrypt(newPassword)); // 使用加密算法对密码进行加密存储
}
// 省略其他方法
}
public String changePassword(UserInfo userInfo, PasswordValidator validator) {
User user = selectUserByPhone(User.builder().phoneNumber(userInfo.getUsername()).build());
if (user == null) {
throw new UserNotFoundException("用户不存在");
}
try {
user.changePassword(userInfo.getNewPassword(), validator);
userInfoMapper.updateByPrimaryKeySelective(user);
return "修改密码成功";
} catch (InvalidPasswordException e) {
throw new RuntimeException(e.getMessage());
}
}
```
阅读全文