在grails中手动注销另一个用户
Manually logout another user in grails
在我的应用程序中,我需要以编程方式注销用户,而不是当前用户。我能够使其会话过期,但这不会强制该特定用户注销。所以我的问题是,如何在用户的下一个请求中强制注销?这是我的代码:
sessionRegistry.getAllPrincipals().each {
principal = it
sessionRegistry.getAllSessions(it, false).each {
if (principal.username == userSec.username) {
it.expireNow()
}
}
}
我的 resources.groovy 里有这个:
sessionRegistry(SessionRegistryImpl)
sessionAuthenticationStrategy(ConcurrentSessionControlStrategy, sessionRegistry) {
maximumSessions = -1
}
concurrentSessionFilter(ConcurrentSessionFilter){
sessionRegistry = sessionRegistry
expiredUrl = '/login/concurrentSession'
}
使用会话机制是不可能的。您必须使用可以保留用户的存储介质。该介质可以是内存中的单例,例如 ConcurrentHashMap
实例,也可以是数据库,具体取决于您的集群架构。
然后在每次调用 springSecurityService.currentUser
时(例如在 Spring 安全核心插件中),您必须检查 sessionRegistry
是否包含该用户,如果不包含,则使会话无效或用户
在我的应用程序中,我需要以编程方式注销用户,而不是当前用户。我能够使其会话过期,但这不会强制该特定用户注销。所以我的问题是,如何在用户的下一个请求中强制注销?这是我的代码:
sessionRegistry.getAllPrincipals().each {
principal = it
sessionRegistry.getAllSessions(it, false).each {
if (principal.username == userSec.username) {
it.expireNow()
}
}
}
我的 resources.groovy 里有这个:
sessionRegistry(SessionRegistryImpl)
sessionAuthenticationStrategy(ConcurrentSessionControlStrategy, sessionRegistry) {
maximumSessions = -1
}
concurrentSessionFilter(ConcurrentSessionFilter){
sessionRegistry = sessionRegistry
expiredUrl = '/login/concurrentSession'
}
使用会话机制是不可能的。您必须使用可以保留用户的存储介质。该介质可以是内存中的单例,例如 ConcurrentHashMap
实例,也可以是数据库,具体取决于您的集群架构。
然后在每次调用 springSecurityService.currentUser
时(例如在 Spring 安全核心插件中),您必须检查 sessionRegistry
是否包含该用户,如果不包含,则使会话无效或用户