Grails SpringSecurityService:是否注销其他用户?
使用Grails SpringSecurityService:是否注销其他用户?,grails,spring-security,Grails,Spring Security,使用springSecurityService,有没有办法让其他人注销 (例如,如果一个普通用户当天离开,忘记注销,经理想注销他们的帐户。)springSecurityService本身不具备此功能 但是,没有什么可以阻止您创建自己的ServletFilter,以跟踪会话ID和安全主体,并公开控制器和页面以使与登录相关的会话无效。以下是我的做法 编辑:下面的示例使用。您还可以直接编辑web.xml。有关设置超时的信息,请参阅 // src/groovy/com/example/ExpiringS
springSecurityService
,有没有办法让其他人注销
(例如,如果一个普通用户当天离开,忘记注销,经理想注销他们的帐户。)springSecurityService本身不具备此功能 但是,没有什么可以阻止您创建自己的
ServletFilter
,以跟踪会话ID和安全主体,并公开控制器和页面以使与登录相关的会话无效。以下是我的做法
编辑:下面的示例使用。您还可以直接编辑web.xml。有关设置超时的信息,请参阅
// src/groovy/com/example/ExpiringSessionEventListener.groovy:
package com.example
import grails.util.Holders
import javax.servlet.http.HttpSessionListener
import javax.servlet.http.HttpSessionEvent
import org.springframework.security.core.context.SecurityContext
public class ExpiringSessionEventListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
// Do some logging
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
SecurityContext securityContext = event.session.getAttribute("SPRING_SECURITY_CONTEXT")
if (securityContext) {
UserService userService = Holders.applicationContext.getBean("userService")
String userName = securityContext.authentication.principal.username
userService.userLoggedOut(userName, event.session.id, Boolean.TRUE)
}
}
}
// grails-app/services/com/example/UserService.groovy:
package com.example
import grails.plugin.springsecurity.annotation.Secured
class UserService {
@Secured(["ROLE_USER"])
def userLoggedOut(String userName, String sessionId, Boolean expired) {
User user = User.findByUsername(userName)
if (expired) {
// Do user cleanup stuff after expired session
} else {
// Do user cleanup stuff after clicking the logout button
}
}
}
编辑:
在我的应用程序中,管理员用户可以强制注销当前登录到系统的所有用户列表中的任何用户
@PreAuthorize(“hasRole('当前登录用户'))
@RequestMapping(value=“/getLoggedInUsers”,method=RequestMethod.POST)
@应答器
public Map>loggedInUserMap=new hashmap何时调用sessionDestroyed
?是不是我可以直接调用它来注销任意用户?我遗漏了一个关键问题。请参阅我对web.xml
和grails-app/conf/WebXmlConfig.groovy
的编辑。容器超时会话时调用sessionDestroyed
方法,在我的例子中为10分钟。我错过了你的第二个问题。你说的任意用户是什么意思?太好了!嗯,我的目标是让经理(例如)点击一个按钮以注销任何其他用户。所以,和我们现在看到的不太一样。不过,这不是一个坏主意。使用上述方法可以避免管理员注销活动用户的情况。但是,您可以使用服务和侦听器方法中的位,并将它们绑定到GUI,管理器在GUI中选择用户并单击注销按钮。您可能想查看,尽管我不认为它提供了任意的注销功能。因此我知道我可以使用内置的session
对象来获取每个用户登录时的会话ID,但是,我使用什么类或对象来通过ID使任意会话无效?前面的SO问答将帮助您理解我的意思,即创建您的won ServletFilter或SessionListener来跟踪会话,然后针对它们使会话无效。很好,这正是我要找的东西。我必须试一下。它的工作是..因为我做了同样的事情…你可以试一下..如果你需要进一步的帮助..你可以问..)
// grails-app/conf/WebXmlConfig.groovy:
webxml {
sessionConfig.sessionTimeout = 10 // minutes
listener.add = true
listener.classNames = [
"com.example.ExpiringSessionEventListener"
]
}