Java Spring Oauth2重复登录

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()

我将SpringOAuth2与自定义提供程序和Mongo会话一起使用

当已经登录的用户导航到授权端点时,Spring会为该用户创建一个新会话。我可以在mongoDB上看到用户的多个重复会话

有没有办法防止这种情况? i、 e.如果用户已登录,请使用当前主体和会话,而不是创建新主体和会话

配置:

@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)
}
  • 并发会话控制--
  • 当已经通过身份验证的用户尝试再次进行身份验证时,应用程序可以通过以下几种方式之一处理该事件。它可以使用户的活动会话无效并使用新会话再次验证用户,或者允许两个会话同时存在

    启用并发会话控制支持的第一步是在web.xml中添加以下侦听器:

    <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。请向我们更新您的研究。谢谢