我有一个CustomSecurityEventListener
可以在成功验证后获取事件,CustomHttpSessionListener
可以设置最长非活动会话时间。
class CustomSecurityEventListener implements ApplicationListener<AbstractAuthenticationEvent>, LogoutHandler {
def grailsApplication
def sessionRegistry
@Transactional
void onApplicationEvent(AbstractAuthenticationEvent event) throws AuthenticationException {
if(event instanceof AuthenticationSuccessEvent){
// user auditing actions
}
}
我想用web界面实现会话管理器,其中管理员可以撤销属于给定用户的会话。
| userName1 | JSESSIONID1234 | action -> revoke |
| userName2 | JSESSIONID4321 | action -> revoke |
您是否有任何adea如何通过使用自定义侦听器(使用sessionCreated()
,sessionDestroyed()
方法)将sessionId与用户关联,并将用户会话对存储在例如。 “activeSession”系列。
我不想将sessionId存储为Spring Security User类中的属性。
先谢谢。
答案 0 :(得分:2)
我在运行功能测试时使用以下侦听器代码来清理会话。
不完全是您正在寻找的内容,但getAllPrincipals()
显示了如何从会话中获取用户(我使用':spring-security-core:1.2.7.3'创建了该代码)。
import static org.springframework.security.web.context.HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY
class SessionListener implements HttpSessionListener {
def sessions = [:].asSynchronized()
void sessionCreated (HttpSessionEvent se) {
sessions.put(se.session.id, se.session)
}
void sessionDestroyed (HttpSessionEvent se) {
sessions.remove(se.session.id)
}
void invalidateSessions () {
def httpSessions = sessions.collect {String sessionId, HttpSession session ->
session
}
httpSessions.each { HttpSession session ->
session.invalidate()
}
}
def getAllPrincipals () {
def principals = []
sessions.each { String sessionId, HttpSession session ->
SecurityContext securityContext = session[SPRING_SECURITY_CONTEXT_KEY]
def authentication = securityContext?.authentication
principals << authentication?.principal
}
principals = principals.findAll {it != null}
principals
}
}