使用Spring Security 3登录处理程序处理失败的登录通知
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Spring Security 3登录处理程序处理失败的登录通知,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3043字,纯文字阅读大概需要5分钟。
内容图文
在我的应用程序中,我想为我的用户增加一个失败的登录尝试计数器,并使用Spring Security版本3.1.4.RELEASE在达到一定的尝试计数时将其锁定.
我已经成功实现了一个简单的登录成功通知处理程序,该处理程序将计数器重置为零并将此状态保存在数据库中,如下所示.
public class BitfoodLoginSuccessHandler extends BitfoodAuthHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest arg0,
HttpServletResponse arg1, Authentication arg2) throws IOException,
ServletException {
String userName = arg2.getName();
AppUser result = getBitfoodDao().getAuthDao().getUser(userName);
if (result.getLoginStatus().getStatus() == UserLoginStatus.STATUS_ACTIVE) {
result.getLoginStatus().setLoginFailCount(0);
getBitfoodDao().getAuthDao().save(result);
} // TODO redirect on success.
}
}
但是,我试图找出如何在故障事件处理程序中实现相反的情况,具体来说就是org.springframework.security.web.authentication.AuthenticationFailureHandler的实现.
public class BitfoodLoginFailedHandler extends BitfoodAuthHandler implements
AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest arg0,
HttpServletResponse arg1, AuthenticationException arg2)
throws IOException, ServletException {
log.info("???????");
/*if (ls.getLoginFailCount() >= 3) { // TODO parameterize this value
ls.setStatus(UserLoginStatus.STATUS_LOCKED);
}*/
}
}
我知道org.springframework.security.core.AuthenticationException提供了这两种方法,它们可能会提供我需要的登录信息.具体来说,我试图找出哪个用户名(如果有的话,如果确实是我在DB上拥有的用户)使当前登录尝试失败.
org.springframework.security.core.AuthenticationException
AuthenticationException::getAuthentication()
AuthenticationException::getExtraInformation()
但是,这两个methodd在API版本3.1.x中都被标记为已弃用.所以:
1)还有其他方法可以使用这些通知处理程序来检索失败的登录用户名吗?
2)我是否应该考虑完全使用另一种机制来执行此逻辑?如果是这样,Spring Security 3提供哪些替代方案?
更新:哇,@ axtavt的答案奏效了,结果比我想的要干净得多,因为我不再需要弄乱安全管理器的筛选器配置了.真好!
更新的代码:
我更改了自定义类的接口:
public class BitfoodLoginFailedHandler extends BitfoodAuthHandler
implements ApplicationListener<AuthenticationFailureBadCredentialsEvent>
public class BitfoodLoginSuccessHandler extends BitfoodAuthHandler
implements ApplicationListener<AuthenticationSuccessEvent>
我实现了适当的方法:
public void onApplicationEvent(AuthenticationSuccessEvent event)
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event)
保留其bean上下文定义的原样:
<beans:bean id="successHandler" class="org.bitfood.admin.auth.BitfoodLoginSuccessHandler">
<beans:property name="bitfoodDao" ref="daoService"/>
</beans:bean>
<beans:bean id="failureHandler" class="org.bitfood.admin.auth.BitfoodLoginFailedHandler">
<beans:property name="bitfoodDao" ref="daoService"/>
</beans:bean>
和瞧!在请求结束之前已收到适当的通知(包括用户名数据).
谢谢!
解决方法:
接收有关身份验证事件的通知的另一种方法是Spring Security广播的listen for ApplicationEvents,即AuthenticationSuccessEvent和AbstractAuthenticationFailureEvent.
内容总结
以上是互联网集市为您收集整理的使用Spring Security 3登录处理程序处理失败的登录通知全部内容,希望文章能够帮你解决使用Spring Security 3登录处理程序处理失败的登录通知所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。