11
回答
java 后台登录输入密码3次后锁定用户,怎么把30分钟后解锁用户
终于搞明白,存储TCO原来是这样算的>>>   

java  后台登录输入密码3次后锁定用户,怎么把30分钟后解锁用户?

我是使用登录失败后把该失败的时间,次数以及用户添加到失败表中,我是想用当前时间减去最后的一次登录失败的时间,来判断是否大于30分钟,可是一般在第三次输入密码的时候就会锁定用户,我的只有在再次登录的时候才能(用户名和密码都对的时候)开始计算当前的时间减去 最后的一次登录失败的时间 ,可是这样就违背了原则了

 

?哪位大神可以解答

<无标签>
举报
HelloWasd
发帖于7天前 11回/382阅
共有11个答案 最后回答: 6天前

下次登录的时候,判断一下状态和锁定时间,解锁的时候;超过30分钟则可以继续通过,并重置状态和锁时间

合理的做法:判断登录次数时候用内存记录失败登录次数的逻辑,例如内存中存failureCount,这个可以使用map结构,key为用户的id,每次登录失败failureCount 加一,如果登录次数大于了3次,再存储一个用户锁定的标识,但是这次存在redis中,因为redis可以设置key有效期,可以充分利用这个特性.。这样登录时先判断用户是否锁定(也就是redis中是否有用户的id key值)。这样系统性能就很高,如果不这样你就需要启动一个单独的线程去定时清除了。并且你这个任务会时刻都在运行,因为你不是一个用户。另外还有一个解决方案是利用jwt生成一个token值,这个值可以控制这个token本身的有效期。你通过登录失败逻辑维护这个值就可以了

其实最最简单的还是放在缓存里面。

缓存有效期30分钟,过期数据由缓存框架自动清理。

public class UserLoginLog implements java.io.Serializable {
    long failureCount = 0; // 登陆错误次数计数器
    Date lastAuditDate = new Date();  / 最后一次登陆审计日期

  // getters and setters
}

由缓存控制数据过期,那么缓存已经自带了数据清理的调度,我们不需要关心这部分,我们只需要按 username 从缓存中取数据,判断是否 null,如果有就判断 登陆失败次数 failureCount 是否达到了 锁定登陆 的次数,在比对登陆密码的时候注意不能用数据库来比对(不一定,但一定要注意大小写敏感已打开),密码不正确则 failureCount++ 然后再更新到缓存里面即可。如果密码正确,则从缓存里面移除数据。

下面是伪代码,EhCache 还有个Element:

Cache cache = CacheManage.getCache(USER_LOGIN_PROTECT_CACHE);

cache.put(username, userLoginLog);

cache.get(username);

cache.remove(username);

如果要 failureCount 计数准确,还需要注意设计模块的方法为同步读写缓存。

缓存框架推荐:

Guava Cache:了解如何使用 http://blog.csdn.net/guozebo/article/details/51590517

EhCache:资料自己找。有点笨重了,还需要XML配置,相比你如果只是拿来实现用户登录保护的功能就Guava更合适。

--- 共有 1 条评论 ---
蓝水晶飞机用户名做 Key,就算分布式攻击也肆无忌惮。 千万不能基于 SessionId,因为这个不能保护用户密码爆破。 6天前 回复
顶部