我的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
我找不到任何内容该用户的会话。
我目前无法解决的问题是:
reauthenticate
被触发,sessionRegistry
我也尝试添加
sessionRegistry.registerNewSession(newSessionId, authentication.getPrincipal())
在[L]
位置,但是这个会话和重新生成的会话似乎没有任何关联。
欢迎任何建议!提前谢谢。
配置
答案 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
,触发所有定义的请求过滤器,依赖于我的并发会话管理。