支持登录IP黑名单限制
This commit is contained in:
		@@ -90,7 +90,7 @@ public class LogAspect
 | 
			
		||||
            SysOperLog operLog = new SysOperLog();
 | 
			
		||||
            operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
 | 
			
		||||
            // 请求的地址
 | 
			
		||||
            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
 | 
			
		||||
            String ip = IpUtils.getIpAddr();
 | 
			
		||||
            operLog.setOperIp(ip);
 | 
			
		||||
            operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
 | 
			
		||||
            if (loginUser != null)
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,6 @@ import org.springframework.stereotype.Component;
 | 
			
		||||
import com.ruoyi.common.annotation.RateLimiter;
 | 
			
		||||
import com.ruoyi.common.enums.LimitType;
 | 
			
		||||
import com.ruoyi.common.exception.ServiceException;
 | 
			
		||||
import com.ruoyi.common.utils.ServletUtils;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.ip.IpUtils;
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +78,7 @@ public class RateLimiterAspect
 | 
			
		||||
        StringBuffer stringBuffer = new StringBuffer(rateLimiter.key());
 | 
			
		||||
        if (rateLimiter.limitType() == LimitType.IP)
 | 
			
		||||
        {
 | 
			
		||||
            stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())).append("-");
 | 
			
		||||
            stringBuffer.append(IpUtils.getIpAddr()).append("-");
 | 
			
		||||
        }
 | 
			
		||||
        MethodSignature signature = (MethodSignature) point.getSignature();
 | 
			
		||||
        Method method = signature.getMethod();
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ public class AsyncFactory
 | 
			
		||||
            final Object... args)
 | 
			
		||||
    {
 | 
			
		||||
        final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
 | 
			
		||||
        final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
 | 
			
		||||
        final String ip = IpUtils.getIpAddr();
 | 
			
		||||
        return new TimerTask()
 | 
			
		||||
        {
 | 
			
		||||
            @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
        {
 | 
			
		||||
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
 | 
			
		||||
            throw new CaptchaExpireException();
 | 
			
		||||
            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();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (!code.equalsIgnoreCase(captcha))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 登录前置校验
 | 
			
		||||
     * @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("user.jcaptcha.error")));
 | 
			
		||||
            throw new CaptchaException();
 | 
			
		||||
            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.password.not.match")));
 | 
			
		||||
            throw new UserPasswordNotMatchException();
 | 
			
		||||
        }
 | 
			
		||||
        // 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("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);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -156,7 +156,7 @@ public class TokenService
 | 
			
		||||
    public void setUserAgent(LoginUser loginUser)
 | 
			
		||||
    {
 | 
			
		||||
        UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
 | 
			
		||||
        String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
 | 
			
		||||
        String ip = IpUtils.getIpAddr();
 | 
			
		||||
        loginUser.setIpaddr(ip);
 | 
			
		||||
        loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
 | 
			
		||||
        loginUser.setBrowser(userAgent.getBrowser().getName());
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user