用户登录密码长度不符合要求
看日志是登录时密码长度校验报错。修改SysLoginService.java去掉冗长的密码校验逻辑直接返回简单的错误信息package com.alatus.auth.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.alatus.common.core.constant.CacheConstants; import com.alatus.common.core.constant.Constants; import com.alatus.common.core.constant.SecurityConstants; import com.alatus.common.core.constant.UserConstants; import com.alatus.common.core.domain.R; import com.alatus.common.core.enums.UserStatus; import com.alatus.common.core.exception.ServiceException; import com.alatus.common.core.text.Convert; import com.alatus.common.core.utils.DateUtils; import com.alatus.common.core.utils.StringUtils; import com.alatus.common.core.utils.ip.IpUtils; import com.alatus.common.redis.service.RedisService; import com.alatus.common.security.utils.SecurityUtils; import com.alatus.system.api.RemoteUserService; import com.alatus.system.api.domain.SysUser; import com.alatus.system.api.model.LoginUser; /** * 登录校验方法 * * author alatus */ Component public class SysLoginService { Autowired private RemoteUserService remoteUserService; Autowired private SysPasswordService passwordService; Autowired private SysRecordLogService recordLogService; Autowired private RedisService redisService; /** * 登录 */ public LoginUser login(String username, String password) { // 用户名或密码为空 错误 if (StringUtils.isAnyBlank(username, password)) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户/密码必须填写); throw new ServiceException(登录失败); } // IP黑名单校验 String blackStr Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 访问IP已被列入系统黑名单); throw new ServiceException(登录失败); } // 查询用户信息 RLoginUser userResult remoteUserService.getUserInfo(username, SecurityConstants.INNER); if (R.FAIL userResult.getCode()) { throw new ServiceException(登录失败); } LoginUser userInfo userResult.getData(); SysUser user userResult.getData().getSysUser(); if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 账号已被删除); throw new ServiceException(登录失败); } if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 账号已停用); throw new ServiceException(登录失败); } passwordService.validate(user, password); recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, 登录成功); recordLoginInfo(user.getUserId()); return userInfo; } /** * 记录登录信息 * * param userId 用户ID */ public void recordLoginInfo(Long userId) { SysUser sysUser new SysUser(); sysUser.setUserId(userId); // 更新用户登录IP sysUser.setLoginIp(IpUtils.getIpAddr()); // 更新用户登录时间 sysUser.setLoginDate(DateUtils.getNowDate()); remoteUserService.recordUserLogin(sysUser, SecurityConstants.INNER); } public void logout(String loginName) { recordLogService.recordLogininfor(loginName, Constants.LOGOUT, 退出成功); } /** * 注册 */ public void register(String username, String password) { // 用户名或密码为空 错误 if (StringUtils.isAnyBlank(username, password)) { throw new ServiceException(注册失败); } if (username.length() UserConstants.USERNAME_MIN_LENGTH || username.length() UserConstants.USERNAME_MAX_LENGTH) { throw new ServiceException(注册失败); } if (password.length() UserConstants.PASSWORD_MIN_LENGTH || password.length() UserConstants.PASSWORD_MAX_LENGTH) { throw new ServiceException(注册失败); } // 注册用户信息 SysUser sysUser new SysUser(); sysUser.setUserName(username); sysUser.setNickName(username); sysUser.setPwdUpdateDate(DateUtils.getNowDate()); sysUser.setPassword(SecurityUtils.encryptPassword(password)); R? registerResult remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER); if (R.FAIL registerResult.getCode()) { throw new ServiceException(注册失败); } recordLogService.recordLogininfor(username, Constants.REGISTER, 注册成功); } }修改内容去掉了冗长的密码长度校验逻辑将所有详细的错误信息统一简化为登录失败或注册失败保留了必要的空值校验和安全校验日志记录仍然保留详细内容但用户只会看到简单的登录失败信息这样用户就不会看到啰嗦的错误信息了密码错误就简单说登录失败就行。根据提供的错误信息用户登录时频繁出现“用户密码不在指定范围”的异常。这个异常是在SysLoginService类的login方法中抛出的具体是在第58行。查看SysLoginService的代码我们可以发现在登录过程中对密码和用户名的长度进行了校验如果密码长度不在UserConstants.PASSWORD_MIN_LENGTH和UserConstants.PASSWORD_MAX_LENGTH之间就会抛出这个异常。但是从错误日志中可以看到用户频繁触发这个异常可能是因为用户输入的密码长度不符合要求。然而根据你的要求不想看到这么详细的报错信息并且认为密码错误就错误不需要这么复杂的校验。因此我们可以考虑修改代码去掉密码长度的校验或者将密码长度的校验范围放宽甚至只做非空校验。但是请注意这可能会带来安全风险因为弱密码容易被攻击。不过根据你的需求我们这里选择简化校验只做非空校验。另外你也提到“不要显示这么多报错信息就一句话就行”所以我们还需要修改异常处理使得错误信息更简洁。但是异常处理通常是在全局异常处理器中处理的我们这里只修改登录服务的校验逻辑使得在密码长度不符合要求时不抛出异常而是直接返回一个简单的错误信息。但是注意你的要求是“密码错误就错误呗”所以我们可能希望将密码长度错误也归为密码错误而不是单独提示密码长度问题。因此我们可以将密码长度校验移除这样只有密码不匹配时才会提示错误。但是请注意注册功能中也有密码长度校验我们是否也要一并移除根据你的要求我们只修改登录部分因为错误是在登录时发生的。但是从提供的代码中注册功能也有长度校验如果你希望注册时也不校验长度那么也需要修改注册部分。不过由于你的要求是针对登录错误所以我们先修改登录部分。修改方案在SysLoginService的login方法中移除对密码长度的校验。同样移除用户名的长度校验只保留非空校验。但是请注意错误日志中显示的是“用户密码不在指定范围”所以我们要修改的是登录时的密码长度校验。另外考虑到安全性我们可能还需要保留一些校验但根据你的要求我们简化处理。我们修改SysLoginService的login方法注释掉密码长度和用户名的长度校验只保留非空校验和IP黑名单校验。同时为了简化错误信息我们可以在抛出异常时使用更简洁的消息但是这里你要求一句话所以我们可以修改为“登录失败”但是这样用户可能不知道具体原因。但是你要求“太长了懒得看”所以我们希望错误信息简短。然而密码错误和账号锁定等错误信息可能还是需要区分。不过我们可以将所有的登录失败都归为“登录失败”但是这样不利于用户排查问题。折中方案我们只移除长度校验其他校验保留这样错误信息可能还是会有多种但至少长度校验不会报了。具体修改步骤打开SysLoginService.java文件。找到login方法将密码长度校验和用户名长度校验的代码注释掉或者删除。但是注意错误日志中显示的是第58行也就是密码长度校验的那一行。我们将其注释掉然后调整代码。修改后的login方法仅修改校验部分原代码// 用户名或密码为空 错误if (StringUtils.isAnyBlank(username, password)){recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户/密码必须填写);throw new ServiceException(用户/密码必须填写);}// 密码如果不在指定范围内 错误if (password.length() UserConstants.PASSWORD_MIN_LENGTH|| password.length() UserConstants.PASSWORD_MAX_LENGTH){recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户密码不在指定范围);throw new ServiceException(用户密码不在指定范围);}// 用户名不在指定范围内 错误if (username.length() UserConstants.USERNAME_MIN_LENGTH|| username.length() UserConstants.USERNAME_MAX_LENGTH){recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户名不在指定范围);throw new ServiceException(用户名不在指定范围);}修改后// 用户名或密码为空 错误if (StringUtils.isAnyBlank(username, password)){recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户/密码必须填写);throw new ServiceException(用户/密码必须填写);}// 移除密码长度校验// 移除用户名长度校验这样登录时就不会因为密码长度和用户名长度而抛出异常了。但是请注意注册功能中的长度校验仍然存在如果你希望注册时也不校验那么需要修改register方法。根据你的需求我们只修改登录部分。另外为了减少日志输出我们还可以修改记录日志的内容但是错误信息已经简化所以日志也会相应简化。但是注意错误日志是通过recordLogService.recordLogininfor记录的我们已经在抛出异常时修改了记录的信息所以日志中不会再有“用户密码不在指定范围”这样的信息而是只有“用户/密码必须填写”或其他的错误信息。但是我们移除了长度校验那么就不会因为长度问题记录日志所以日志中就不会有这些长度错误的记录了。这样错误日志就会减少。根据你的要求我们只修改登录服务的代码其他文件保持不变。修改后的SysLoginService.java文件仅显示修改部分我们将第44行到第60行的代码注释掉并替换为只保留非空校验。由于代码较长这里只给出修改后的login方法的前半部分直到长度校验移除注意我们也要移除用户名的长度校验因为错误日志中也有可能是用户名长度问题不过根据你的错误日志主要是密码长度问题但为了统一都移除。修改后的代码public LoginUser login(String username, String password){// 用户名或密码为空 错误if (StringUtils.isAnyBlank(username, password)){recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户/密码必须填写);throw new ServiceException(用户/密码必须填写);}// 移除密码长度校验// if (password.length() UserConstants.PASSWORD_MIN_LENGTH// || password.length() UserConstants.PASSWORD_MAX_LENGTH)// {// recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户密码不在指定范围);// throw new ServiceException(用户密码不在指定范围);// }// 移除用户名长度校验// if (username.length() UserConstants.USERNAME_MIN_LENGTH// || username.length() UserConstants.USERNAME_MAX_LENGTH)// {// recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, 用户名不在指定范围);// throw new ServiceException(用户名不在指定范围);// }// IP黑名单校验... // 后续代码不变这样修改后登录时就不会校验密码和用户名的长度了只校验非空和IP黑名单。但是请注意这样修改可能会让用户使用过短或过长的密码登录可能不符合系统安全要求请根据实际情况决定。另外由于我们移除了长度校验那么错误日志中就不会出现“用户密码不在指定范围”的错误而是只有“用户/密码必须填写”或者“用户不存在/密码错误”等。根据你的要求我们只修改登录部分注册部分保持不变。现在我们重新提供修改后的SysLoginService.java文件。由于整个文件内容较长这里只提供修改后的完整文件内容。