Spring Security Core插件-使用户会话无效

问题描述

我正在使用grails 4.0.3,并且试图以编程方式注销用户。我进行了搜索,但是找到的所有解决方案都适用于grails 2,不适用于grails 4。

就像-force logout for authenticated user using spring security plugin

有人知道如何使用户会话无效吗?

解决方法

有人知道如何使用户会话无效吗?

在控制器中,您可以调用session.invalidate()

如果您想从其他上下文访问会话,则可以让该类实现grails.web.api.ServletAttributes特性,它将为该类提供session属性,然后session.invalidate()从那里被召唤。

,

Jeff的解决方案仅适用于当前用户的会话。如果要注销/使所有会话(或特定用户的所有会话)无效,则可以使用此解决方案。

制作自定义会话侦听器类-

class MyCustomSessionListener implements HttpSessionListener {
  Map<String,HttpSession> sessions = [:].asSynchronized()

  void sessionCreated(HttpSessionEvent se) {
    sessions.put(se.session.id,se.session)
  }

  void sessionDestroyed(HttpSessionEvent se) {
    sessions.remove(se.session.id)
  }

  void invalidateAllSessionsOfUser(String username) {
    List<HttpSession> sessionsList = []
    sessions.each { sessionId,sess ->
      SecurityContext sc = sess[SPRING_SECURITY_CONTEXT_KEY]
      if (sc.authentication.principal.username == username) {
        sessionsList.add(sess)
      }
    }
    sessionsList*.invalidate()
  }
  
  void invalidateAllSessions() {
    List<HttpSession> sessionsList = []
    sessions.each { sessionId,sess ->
      sessionsList.add(sess)
    }
    sessionsList*.invalidate()
  }
}

并在resources.groovy

中输入
beans = {
  myCustomSessionListener(MyCustomSessionListener)
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...