Java Spring Oauth2重复登录
我将SpringOAuth2与自定义提供程序和Mongo会话一起使用 当已经登录的用户导航到授权端点时,Spring会为该用户创建一个新会话。我可以在mongoDB上看到用户的多个重复会话 有没有办法防止这种情况? i、 e.如果用户已登录,请使用当前主体和会话,而不是创建新主体和会话 配置:Java Spring Oauth2重复登录,java,spring,spring-security,Java,Spring,Spring Security,我将SpringOAuth2与自定义提供程序和Mongo会话一起使用 当已经登录的用户导航到授权端点时,Spring会为该用户创建一个新会话。我可以在mongoDB上看到用户的多个重复会话 有没有办法防止这种情况? i、 e.如果用户已登录,请使用当前主体和会话,而不是创建新主体和会话 配置: @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement()
@Override
protected void configure(HttpSecurity http)
throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
}
<http ...>
<session-management>
<concurrency-control max-sessions="2" />
</session-management>
</http>
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2)
}
@覆盖
受保护的无效配置(HttpSecurity http)引发异常{
http
.csrf().disable()
.cors()
.及()
.授权请求()
.antMatchers(“/auth/**”,“/oauth2/**”,“/v1/**”)
.permitAll()
.anyRequest()
.authenticated()
.及()
.oauth2Login()
.authorizationEndpoint()
.baseUri(“/oauth2/authorize”)
.及()
.redirectionEndpoint()文件
.baseUri(“/auth/callback/*”);
}
在这种情况下,您必须禁用或控制会话
always – a session will always be created if one
doesn't already exist
ifRequired – a session will be created only if
required (default)
never – the framework will never create a
session itself but it will use one if it already
exists
stateless – no session will be created or used
by Spring Security
Java配置:
@Override
protected void configure(HttpSecurity http)
throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
}
<http ...>
<session-management>
<concurrency-control max-sessions="2" />
</session-management>
</http>
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2)
}
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
这对于确保在会话被销毁时通知Spring安全会话注册表是至关重要的
要启用允许同一用户有多个并发会话的场景,应在XML配置中使用元素:
@Override
protected void configure(HttpSecurity http)
throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
}
<http ...>
<session-management>
<concurrency-control max-sessions="2" />
</session-management>
</http>
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2)
}
请看下面的链接--
经过一些研究,我发现这种行为是由于Spring的会话固定攻击保护造成的 默认情况下,Spring会在重新验证时迁移会话,这使得Spring可以通过复制上一个会话中的现有属性为用户创建新会话 但是,当发生这种情况时,
spring会话数据mongodb
不会出于某种原因删除旧的无效会话。我不知道为什么spring session data mongodb
没有删除旧会话,所以如果有人知道如何更改,请告诉我
但是,如果要更改此行为,可以将会话设置更改为以下设置,以使spring在重新身份验证时使用现有会话ID:
@覆盖
受保护的无效配置(HttpSecurity http)引发异常{
http.sessionManagement().sessionFixation().none()
}
您使用的OAuth流是什么?1) 授权代码流2)隐式流3)客户端凭据流(微服务之间的授权)。请提供有关您的代码的详细信息。我使用的是授权代码流,大多数设置都是默认设置。每次打开授权端点(例如/oauth2/authorization/provider)时,我都可以看到在mongo上创建了一个新的会话条目。我添加了安全配置代码,每个会话条目都创建了新的令牌(JWT令牌)。请提供Mongo上的数据DB@Numery以下是连续3次打开授权端点后mongo“sessions”集合的外观:我添加了您提到的设置,但仍然在mongo上获得多个条目。我相信这可能是spring会话数据mongodb的问题,而不是spring安全性的问题。我认为会话已失效,新会话已创建,但mongo上的条目未被删除。我认为这是因为我尝试更改所有文档上主体字段的值,并且在再次登录后,主体的值在所有mongo文档上都设置为正确的值。Aiden-非常感谢您的更新。你能把数据库改成mysql并更新我们吗。这对很多人都有帮助。我会试试的。还有一件事,我尝试将sessionCreationPolicy更改为NEVER,但我仍然看到相同的行为,这似乎很奇怪。Aiden-mysql上的并发会话在我这方面运行良好。但我不确定mongodb。请向我们更新您的研究。谢谢