|  | @@ -9,16 +9,18 @@ import org.springframework.security.core.Authentication;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Component;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.constant.CacheConstants;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.constant.Constants;
 | 
	
		
			
				|  |  | +import com.ruoyi.common.constant.UserConstants;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.core.domain.entity.SysUser;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.core.domain.model.LoginUser;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.core.redis.RedisCache;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.exception.ServiceException;
 | 
	
		
			
				|  |  | +import com.ruoyi.common.exception.user.BlackListException;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.exception.user.CaptchaException;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.exception.user.CaptchaExpireException;
 | 
	
		
			
				|  |  | +import com.ruoyi.common.exception.user.UserNotExistsException;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.utils.DateUtils;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.utils.MessageUtils;
 | 
	
		
			
				|  |  | -import com.ruoyi.common.utils.ServletUtils;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.utils.StringUtils;
 | 
	
		
			
				|  |  |  import com.ruoyi.common.utils.ip.IpUtils;
 | 
	
		
			
				|  |  |  import com.ruoyi.framework.manager.AsyncManager;
 | 
	
	
		
			
				|  | @@ -61,12 +63,10 @@ public class SysLoginService
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public String login(String username, String password, String code, String uuid)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        boolean captchaEnabled = configService.selectCaptchaEnabled();
 | 
	
		
			
				|  |  | -        // 验证码开关
 | 
	
		
			
				|  |  | -        if (captchaEnabled)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            validateCaptcha(username, code, uuid);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        // 验证码校验
 | 
	
		
			
				|  |  | +        validateCaptcha(username, code, uuid);
 | 
	
		
			
				|  |  | +        // 登录前置校验
 | 
	
		
			
				|  |  | +        loginPreCheck(username, password);
 | 
	
		
			
				|  |  |          // 用户验证
 | 
	
		
			
				|  |  |          Authentication authentication = null;
 | 
	
		
			
				|  |  |          try
 | 
	
	
		
			
				|  | @@ -110,18 +110,58 @@ public class SysLoginService
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void validateCaptcha(String username, String code, String uuid)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
 | 
	
		
			
				|  |  | -        String captcha = redisCache.getCacheObject(verifyKey);
 | 
	
		
			
				|  |  | -        redisCache.deleteObject(verifyKey);
 | 
	
		
			
				|  |  | -        if (captcha == null)
 | 
	
		
			
				|  |  | +        boolean captchaEnabled = configService.selectCaptchaEnabled();
 | 
	
		
			
				|  |  | +        if (captchaEnabled)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
 | 
	
		
			
				|  |  | +            String captcha = redisCache.getCacheObject(verifyKey);
 | 
	
		
			
				|  |  | +            redisCache.deleteObject(verifyKey);
 | 
	
		
			
				|  |  | +            if (captcha == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
 | 
	
		
			
				|  |  | +                throw new CaptchaExpireException();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (!code.equalsIgnoreCase(captcha))
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
 | 
	
		
			
				|  |  | +                throw new CaptchaException();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 登录前置校验
 | 
	
		
			
				|  |  | +     * @param username 用户名
 | 
	
		
			
				|  |  | +     * @param password 用户密码
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void loginPreCheck(String username, String password)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // 用户名或密码为空 错误
 | 
	
		
			
				|  |  | +        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
 | 
	
		
			
				|  |  | +            throw new UserNotExistsException();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 密码如果不在指定范围内 错误
 | 
	
		
			
				|  |  | +        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
 | 
	
		
			
				|  |  | +                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
 | 
	
		
			
				|  |  | +            throw new UserPasswordNotMatchException();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 用户名不在指定范围内 错误
 | 
	
		
			
				|  |  | +        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
 | 
	
		
			
				|  |  | +                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
 | 
	
		
			
				|  |  | -            throw new CaptchaExpireException();
 | 
	
		
			
				|  |  | +            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
 | 
	
		
			
				|  |  | +            throw new UserPasswordNotMatchException();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (!code.equalsIgnoreCase(captcha))
 | 
	
		
			
				|  |  | +        // IP黑名单校验
 | 
	
		
			
				|  |  | +        String blackStr = configService.selectConfigByKey("sys.login.blackIPList");
 | 
	
		
			
				|  |  | +        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
 | 
	
		
			
				|  |  | -            throw new CaptchaException();
 | 
	
		
			
				|  |  | +            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
 | 
	
		
			
				|  |  | +            throw new BlackListException();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -134,7 +174,7 @@ public class SysLoginService
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          SysUser sysUser = new SysUser();
 | 
	
		
			
				|  |  |          sysUser.setUserId(userId);
 | 
	
		
			
				|  |  | -        sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
 | 
	
		
			
				|  |  | +        sysUser.setLoginIp(IpUtils.getIpAddr());
 | 
	
		
			
				|  |  |          sysUser.setLoginDate(DateUtils.getNowDate());
 | 
	
		
			
				|  |  |          userService.updateUserProfile(sysUser);
 | 
	
		
			
				|  |  |      }
 |