在Grails 2.5.5 w/Spring Security上登录失败时获取用户名

在Grails 2.5.5 w/Spring Security上登录失败时获取用户名,grails,grails-spring-security,Grails,Grails Spring Security,我需要捕获登录失败时的用户名,以便进行分析,以检测可能存在登录我的应用程序问题的攻击和用户 在所有控制器和操作的过滤器上,我使用域类ActivityLog创建了一个日志,其中存储了每个请求的所有请求/参数数据。当我试图从登录控制器获取操作的用户名时,用户名不在参数上,也不在j_用户名上 如何从筛选器获取失败登录时使用的用户名 参数如下所示:[login\u错误:1,操作:auth,控制器:login] 我试图从GrailsAnonymousAuthenticationToken获取信息,但用户名

我需要捕获登录失败时的用户名,以便进行分析,以检测可能存在登录我的应用程序问题的攻击和用户

在所有控制器和操作的过滤器上,我使用域类ActivityLog创建了一个日志,其中存储了每个请求的所有请求/参数数据。当我试图从登录控制器获取操作的用户名时,用户名不在参数上,也不在j_用户名上

如何从筛选器获取失败登录时使用的用户名

参数如下所示:[login\u错误:1,操作:auth,控制器:login]


我试图从GrailsAnonymousAuthenticationToken获取信息,但用户名是grails.anonymous.user

简而言之,您无法在筛选器中获取该信息

很长的答案是使用内置于Grails的spring security核心插件中的事件来响应失败的身份验证事件

下面是Grails2.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
}

将尝试并返回:)使用spring security和com.google.guava:guava,您实际上可以让它保留一个失败登录的缓存,并在超过阈值时锁定underyling帐户-看看这个演示项目,guava和spring security都配置在grails 3上,但应该是几乎相同的主体—有针对它们的服务罗金卡什么的。。它和番石榴结在一起