mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 08:13:44 +08:00 
			
		
		
		
	update 适配ruoyi错误登录与解锁功能
This commit is contained in:
		@@ -26,6 +26,7 @@ import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.redis.RedisUtils;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
@@ -48,6 +49,12 @@ public class SysLoginService {
 | 
			
		||||
    private final LogininforService asyncService;
 | 
			
		||||
    private final SysPermissionService permissionService;
 | 
			
		||||
 | 
			
		||||
    @Value("${user.password.maxRetryCount}")
 | 
			
		||||
    private Integer maxRetryCount;
 | 
			
		||||
 | 
			
		||||
    @Value("${user.password.lockTime}")
 | 
			
		||||
    private Integer lockTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 登录验证
 | 
			
		||||
     *
 | 
			
		||||
@@ -243,27 +250,25 @@ public class SysLoginService {
 | 
			
		||||
     */
 | 
			
		||||
    private void checkLogin(LoginType loginType, String username, Supplier<Boolean> supplier) {
 | 
			
		||||
        HttpServletRequest request = ServletUtils.getRequest();
 | 
			
		||||
        String errorKey = CacheConstants.LOGIN_ERROR + username;
 | 
			
		||||
        Integer errorLimitTime = Constants.LOGIN_ERROR_LIMIT_TIME;
 | 
			
		||||
        Integer setErrorNumber = Constants.LOGIN_ERROR_NUMBER;
 | 
			
		||||
        String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
 | 
			
		||||
        String loginFail = Constants.LOGIN_FAIL;
 | 
			
		||||
 | 
			
		||||
        // 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip)
 | 
			
		||||
        Integer errorNumber = RedisUtils.getCacheObject(errorKey);
 | 
			
		||||
        // 锁定时间内登录 则踢出
 | 
			
		||||
        if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(setErrorNumber)) {
 | 
			
		||||
            asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), errorLimitTime), request);
 | 
			
		||||
            throw new UserException(loginType.getRetryLimitExceed(), errorLimitTime);
 | 
			
		||||
        if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
 | 
			
		||||
            asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime), request);
 | 
			
		||||
            throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (supplier.get()) {
 | 
			
		||||
            // 是否第一次
 | 
			
		||||
            errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
 | 
			
		||||
            // 达到规定错误次数 则锁定登录
 | 
			
		||||
            if (errorNumber.equals(setErrorNumber)) {
 | 
			
		||||
                RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(errorLimitTime));
 | 
			
		||||
                asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), errorLimitTime), request);
 | 
			
		||||
                throw new UserException(loginType.getRetryLimitExceed(), errorLimitTime);
 | 
			
		||||
            if (errorNumber.equals(maxRetryCount)) {
 | 
			
		||||
                RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
 | 
			
		||||
                asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime), request);
 | 
			
		||||
                throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
 | 
			
		||||
            } else {
 | 
			
		||||
                // 未达到规定错误次数 则递增
 | 
			
		||||
                RedisUtils.setCacheObject(errorKey, errorNumber);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user