Spring security Spring Security ApplicationListener<;HttpSessionDestroyedEvent>;在登录时调用

Spring security Spring Security ApplicationListener<;HttpSessionDestroyedEvent>;在登录时调用,spring-security,Spring Security,我使用的是Spring Security,我已经为HttpSessionDestroyedEvent(用于注销和会话到期事件)创建了一个ApplicationListener。但是这个监听器的onApplicationEvent方法在登录时也被调用,这看起来是一个不合适的行为。我该如何使它工作。代码如下: 公共类MySessionDestroyListener实现ApplicationListener{ @凌驾 Application Event(HttpSessionDestroyedEven

我使用的是Spring Security,我已经为
HttpSessionDestroyedEvent
(用于注销和会话到期事件)创建了一个
ApplicationListener
。但是这个监听器的
onApplicationEvent
方法在登录时也被调用,这看起来是一个不合适的行为。我该如何使它工作。代码如下:

公共类MySessionDestroyListener实现ApplicationListener{
@凌驾
Application Event(HttpSessionDestroyedEvent HttpSessionDestroyedEvent)上的公共无效{
httpSessionDestroyedEvent.getSecurityContext();
//业务逻辑
}
}

你应该做好准备。servlet容器通常在用户连接之前创建会话。当spring security对用户进行身份验证时,它首先关闭上一个会话并创建一个新会话


这意味着在登录和注销时都会触发一个事件。您可以通过在会话中存储例如用户名来区分事件中的这两个扭结。如果它存在,那么会话是一个常规会话,调用您的业务逻辑是有意义的,如果不是,那么它只是一个技术逻辑,您应该忽略它,您应该做好准备。servlet容器通常在用户连接之前创建会话。当spring security对用户进行身份验证时,它首先关闭上一个会话并创建一个新会话


这意味着在登录和注销时都会触发一个事件。您可以通过在会话中存储例如用户名来区分事件中的这两个扭结。如果存在,则会话是常规会话,调用您的业务逻辑是有意义的,如果不存在,则它只是一个技术会话,您应该忽略它

如果您的登录页面在Servlet 3.0或更旧的容器中使用HTTP会话,会话固定攻击保护将破坏此会话并创建一个新会话(
migrateSession
),请参见:

会话固定攻击保护

会话固定攻击是一种潜在风险,恶意攻击者可能通过访问站点创建会话,然后说服其他用户使用同一会话登录(例如,通过向他们发送包含会话标识符作为参数的链接).Spring Security通过在用户登录时创建新会话或以其他方式更改会话ID来自动对此进行保护。如果您不需要此保护,或者它与其他要求冲突,则可以使用
上的
会话固定保护
属性来控制行为,该属性有四个选项离子

  • none
    -什么都不要做。原始会话将被保留
  • newSession
    -创建新的“干净”会话,而不复制现有会话数据(仍将复制与Spring安全相关的属性)
  • migrateSession
    -创建一个新会话并将所有现有会话属性复制到新会话。这是Servlet 3.0或更早版本容器中的默认设置
  • changeSessionId
    -不要创建新会话。而是使用Servlet容器(HttpServletRequest#changeSessionId())提供的会话固定保护。此选项仅在Servlet 3.1(Java EE 7)中可用和较新的容器。在较旧的容器中指定它将导致异常。这是Servlet 3.1和较新容器中的默认值
当会话固定保护发生时,它会导致在应用程序上下文中发布一个
SessionFixationProtectionEvent
。如果使用
changeSessionId
,此保护还会导致任何
javax.servlet.http.HttpSessionIdListener
被通知,因此如果您的代码同时侦听两个eve,请小心nts。有关更多信息,请参阅会话管理一章

对于这个问题,有一些解决方案:

  • 不要将会话用于登录页面(在大多数情况下不可能)
  • 更新到Servlet3.1容器
  • 将会话固定攻击保护更改为
    none
    (不推荐)
  • 采用您的业务逻辑

如果您的登录页面在Servlet 3.0或更早版本的容器中使用HTTP会话,会话固定攻击保护将破坏此会话并创建一个新会话(
migrateSession
),请参阅:

会话固定攻击保护

会话固定攻击是一种潜在风险,恶意攻击者可能通过访问站点创建会话,然后说服其他用户使用同一会话登录(例如,通过向他们发送包含会话标识符作为参数的链接).Spring Security通过在用户登录时创建新会话或以其他方式更改会话ID来自动对此进行保护。如果您不需要此保护,或者它与其他要求冲突,则可以使用
上的
会话固定保护
属性来控制行为,该属性有四个选项离子

  • none
    -什么都不要做。原始会话将被保留
  • newSession
    -创建新的“干净”会话,而不复制现有会话数据(仍将复制与Spring安全相关的属性)
  • migrateSession
    -创建一个新会话并将所有现有会话属性复制到新会话。这是Servlet 3.0或更早版本容器中的默认设置
  • changeSessionId
    -不要创建新会话。而是使用Servlet容器(HttpServletRequest#changeSessionId())提供的会话固定保护。此选项仅在Servlet 3.1(Java EE 7)和更新的容器中可用。请指定