在spring security中为不同的选项卡强制执行单独的会话

时间:2014-06-24 07:10:12

标签: spring session spring-mvc spring-security

我在我的网络应用程序中使用spring security v 3.1.3。该应用程序有一个单独的条目登录表单,使用spring-filter中的custom-filter进行自定义。目前,我的配置允许用户自动登录应用程序,如果他从同一浏览器中的不同选项卡打开URL,这是spring安全会话管理的默认行为。

我想确保无论何时用户登录应用程序,都不应在不同的选项卡之间共享会话。在打开新选项卡时,他应该获得登录页面并登录将在同一浏览器中创建新会话。目前我无法通过Spring安全框架找到任何方法。我不介意在网址中集成JsessionID,但如果有另一种方式会更好。

2 个答案:

答案 0 :(得分:0)

这不是对Spring Security的限制,这是浏览器如何使用Cookie的一般限制;如果你设置了一个cookie,它将被所有标签共享。

说我现在能想到的唯一合理的选择就是按照你的建议在网址中加入会话ID。

答案 1 :(得分:0)

您可以使用 HeaderWebSessionIdResolver。 Spring 默认使用 CookieWebSessionIdResolver。

要使用它,请使用随机 sessionId 并将其保存在会话存储中,然后将其与您的标头一起发送。这会因标签而异,并会为您提供不同的网络会话。

val headerName = "SomeHeaderName"

@Configuration
class SessionConfig {

    @Bean
    fun headerWebSessionIdResolver(): WebSessionIdResolver {
        return HeaderWebSessionIdResolver().apply {
            headerName = headerName
        }
    }

    @Bean
    fun webSessionManager(webSessionIdResolver: WebSessionIdResolver): DefaultWebSessionManager {
        return DefaultWebSessionManager().apply {
            sessionIdResolver = webSessionIdResolver
        }
    }
}