我需要在登录失败尝试时捕获用户名以进行分析以检测在我的应用程序中登录时可能存在问题的攻击和用户。
在所有控制器和操作的过滤器上,我使用域类 ActivityLog 创建一个日志,其中存储了每个请求的所有请求/参数数据。当我尝试获取来自登录控制器的操作的用户名时,用户名不在参数上,也不在j_username上。
如何从过滤器中获取登录失败时使用的用户名?
参数如下所示:[login_error:1, 操作:身份验证, 控制器:登录]
我试图从GrailsAnonymousAuthenticationToken获取信息,但用户名是grails.anonymous.user
简短的回答是您无法在过滤器中获取该信息。
长答案是使用内置在 Spring 安全核心插件中的事件,让 Grails 对失败的身份验证事件做出反应。
下面是一个Grails 2.4.x应用程序的示例
// Config.groovy
grails.plugin.springsecurity.apf.storeLastUsername = true // this is now needed with updated version of spring security
grails.plugin.springsecurity.useSecurityEventListener = true
grails.plugin.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
// Successful login stuff in here
}
grails.plugin.springsecurity.onAbstractAuthenticationFailureEvent = { e, appCtx ->
// Failed login stuff in here
// e.getAuthentication().getPrincipal() contains the principal object
}