4

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

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

谢谢

环境细节:Shiro core 1.2.1 和 jdbc realm

开始文档 第 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 来表示特定的失败场景 //没有问题,按预期继续... End Documentaion

4

1 回答 1

8

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

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

于 2013-02-11T21:13:11.590 回答