如何为 Apache Shiro 过多的登录尝试失败配置阈值?

Posted

技术标签:

【中文标题】如何为 Apache Shiro 过多的登录尝试失败配置阈值?【英文标题】:How configure threashold for Apache Shiro Excessive Failed Login Attempts? 【发布时间】:2013-01-25 12:55:30 【问题描述】:

Apache Shiro 文档暗示了一些用于捕获连续失败的登录尝试(以及其他)的所需功能,但是,我找不到具体的文档。目前我可以执行 currentUser.login(token);使用无效 pw 无限次,并且不会捕获并抛出此错误。我正在努力寻找它在源代码中的实现位置。

这真的有效吗? shiro.ini 中是否配置了阈值?谁能指出我的文档(或确认它不存在)?

谢谢

环境详情:Shiro core 1.2.1 和 jdbc 领域

开始文档 第 3 步:处理成功或失败 如果登录方法安静地返回,就是这样——我们完成了!主题已通过身份验证。应用程序线程可以继续不间断,对 SecurityUtils.getSubject() 的所有进一步调用都将返回经过身份验证的 Subject 实例,对 subject.isAuthenticated() 的任何调用都将返回 true。

但是如果登录尝试失败会发生什么?例如,如果最终用户提供了错误的密码,或者访问系统次数过多,可能他们的帐户被锁定了怎么办?

Shiro 具有丰富的运行时 AuthenticationException 层次结构,可以准确指示尝试失败的原因。您可以将登录包装在 try/catch 块中并捕获您希望的任何异常并相应地对它们做出反应。例如:

try 
    currentUser.login(token);
 catch ( UnknownAccountException uae )  ...
 catch ( IncorrectCredentialsException ice )  ...
 catch ( LockedAccountException lae )  ...
 catch ( **ExcessiveAttemptsException** eae )  ...
 ... catch your own ...
 catch ( AuthenticationException ae ) 
    //unexpected error?


//No problems, continue on as expected...

如果现有的异常类之一不能满足您的需求,可以创建自定义 AuthenticationExceptions 来表示特定的失败场景 //没问题,按预期继续... 结束文档

【问题讨论】:

【参考方案1】:

如果您只是在 Google 上搜索 ExcessiveAttemptsException,在 second link 中您会从 shiro 的作者 Les Hazlewood 那里找到答案:

无论如何,该异常存在,但它不会被抛出/管理 由 Shiro 指出。它是为了方便您使用,所以您 如果您不想,不必创建自己的 Exception 类。 您需要实例化并将其放入您的领域 适当时使用 doGetAuthenticationInfo 方法。四郎的理由 不能自动执行此操作是这种类型的逻辑(锁定帐户 在一定分钟数内一定次数后)是 通常完全取决于您的应用程序的用户数据模型。

【讨论】:

以上是关于如何为 Apache Shiro 过多的登录尝试失败配置阈值?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Shiro:将我重定向到登录页面

shiro简介

Apache Shiro 和 SSO

每个用户的最大用户会话数 - apache shiro

apache shiro 使用 Hashing Credentials 无法成功登录

如何使用 apache shiro 永久保持登录状态