问题
登录无错误限制,均可以无限制的尝试登录
解决方法
增加登录错误计数 达到一定数量就禁止用户登录一定时间
列子
@Aspect
@Component
public class SysUserAspect {
public static final List<String> methods = new ArrayList<>();
//这里写上方法名
static {
methods.add("login");
}
@Resource
private StringRedisTemplate stringRedisTemplate;
//方法的切入点
@Pointcut("execution(* com.a.b.service.LoginController.*(..))")
public void point() {
}
@Around(value = "point()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Signature signature = proceedingJoinPoint.getSignature();
if (methods.contains(signature.getName())) {
Object[] args = proceedingJoinPoint.getArgs();
//这里是你的登录参数
LoginParam loginParam = (LoginParam) args[0];
Object result;
//如果不是密码登录 直接返回
if (!LoginParam.LOGIN_TYPE_PASSWORD.equals(loginParam.getLoginType())) {
return proceedingJoinPoint.proceed();
}
try {
//判断当前用户有没有被锁定
String mobile = loginParam.getMobile();
String userBlock = stringRedisTemplate.opsForValue().get(RedisCache.userBlock(mobile));
if (!StringUtils.isEmpty(userBlock)) {
throw new CustomException("用户名或密码错误过多,锁定账户15分钟");
}
result = proceedingJoinPoint.proceed();
} catch (BaseCustomeException exception) {
//如果是密码错误
if (BaseCustomeException.PASSWORD_ERROR.equals(exception) ) {
//那么增加当前用户的登录错误次数
Long increment = stringRedisTemplate.opsForValue().increment(RedisCache.loginCount(loginParam.getMobile()));
//如果错误次数大于等于3 锁定该用户
if (increment >= 3) {
stringRedisTemplate.opsForValue().
set(RedisCache.userBlock(loginParam.getMobile()),
loginParam.getMobile(), 15, TimeUnit.MINUTES);
throw new BaseCustomeException("用户名或密码错误过多,锁定账户15分钟");
}
throw new BaseCustomeException("用户名或密码错误,还有" + (3 - increment) + "次将锁定账户15分钟");
}
throw exception;
}
//如果登录成功 那么清空密码错误次数
stringRedisTemplate.delete(RedisCache.loginCount(loginParam.getMobile()));
return result;
}
return proceedingJoinPoint.proceed();
}
}