Redis+lua脚本限制ip多次输入错误密码
不能锁username,因为如果有人恶意保留破解密码的话。会导致用户本人无法登录。
这里我采用 以ip的方式进行锁定。利用redis
设置key:ip。value:当前ip尝试登录的次数
实现逻辑
逻辑简单,假设限制错误次数为5
- 用户登录时。判断key是否存在。
- 如果key不存在,说明第一次登录。判断密码是否正确,如果正确什么都不干直接返回。如果不正确,设置key为ip,value为1,并设置过期时间,返回错误信息。
- 如果存在key,说明之前尝试登录过。判断value是否大于阈值,如果大于阈值刷新过期 并返回错误。如果小于阈值,还要判断密码是否正确。如果密码正确,删除key并返回正确信息。如果密码不正确,将key的value值+1并重置过期时间,返回密码错误的信息。
以上主要注意两点
一点是有key的情况下密码正确需要删除key。
二是有key的情况下,密码错误或者尝试次数大于阈值再次尝试登录,需要刷新过期时间。
使用lua脚本主要保证了对上述逻辑的原子性,因为涉及获取key的值并判断,然后将key的值+1 或 删除key。
实现代码
Service类加载时,加载lua脚本
private static final DefaultRedisScript<Long> CHECK_LOGIN_SCRIPT;
// 类加载时 加载lua脚本
static {
CHECK_LOGIN_SCRIPT = new DefaultRedisScript<>();
CHECK_LOGIN_SCRIPT.setLocation(new ClassPathResource("checkLogin.lua"));
CHECK_LOGIN_SCRIPT.setResultType(Long.class);
}
具体校验方法,主要逻辑调用了lua脚本
private void checkLoginInfo(Us