0

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

喜欢 -使用弹簧安全插件强制注销经过身份验证的用户

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

4

2 回答 2

1

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

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

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

于 2020-10-23T15:18:48.447 回答
0

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)
}
于 2020-10-30T09:41:03.660 回答