Grails 3 - springSecurity reauthenticate和SessionRegistry

时间:2017-02-03 16:54:40

标签: authentication grails spring-security grails3

我的Grails应用程序(使用Spring Security插件)提供了非常基本的支持,可以快速登录'功能,基本上提示用户只键入他们的密码才能登录userId存储在加密的cookie中。

所以在我的控制器中我正在使用 springSecurityService.reauthenticate(userid)
手动验证用户。

我的应用程序还要求不允许并发会话。所以,与前一行一起,我添加了

def authentication = SecurityContextHolder.context.authentication
def sessions = sessionRegistry.getAllSessions(authentication.getPrincipal(), false)
// [L]
sessions.each {
    it.expireNow()
}

问题是这些重新验证没有反映在sessionRegistry的条目中,而且这是上述代码的问题,因为sessions我找不到任何内容该用户的会话。

我目前无法解决的问题是:

  • 用户[U]登录位置[A]
  • [U]登录到位置[B] =>会话[A]被迫过期
  • [U]继续导航/刷新[A],并提示快速登录
  • [U]再次登录[A] => reauthenticate被触发,sessionRegistry
  • 没有添加任何内容
  • [U]继续导航/刷新[B],并提示快速登录
  • [U]再次登录[B]
  • [U]同时登录[A]和[B]

我也尝试添加
sessionRegistry.registerNewSession(newSessionId, authentication.getPrincipal())
[L]位置,但是这个会话和重新生成的会话似乎没有任何关联。

欢迎任何建议!提前谢谢。

配置

  • Grails 3.2.4
  • Spring Security Plugin(core)3.1.1

1 个答案:

答案 0 :(得分:0)

经过几次尝试,我想出了一个可行的解决方案

// injected dependencies
AuthenticationManager authenticationManager
SessionAuthenticationStrategy sessionAuthenticationStrategy

// code
Authentication auth = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.email, params.password))
SecurityContextHolder.context.authentication = authResult   // need to reassign to context, otherwise onAuthentication fails (wrong password)
sessionAuthenticationStrategy.onAuthentication(authResult, request, response)

诀窍似乎是调用onAuthentication,触发所有定义的请求过滤器,依赖于我的并发会话管理。