SpringSecurity的一个问题

描述:

  • 我在做SpringSecurity的一个项目,目前做到管理Session的相关内容。已经成功限制同个用户的登录,即:如果用户在google浏览器登录了,就无法在别的浏览器或者别的地方再次登录。

项目背景:

遇到的问题:

  • 在限制用户的登录以后,登录第一次会成功,关掉浏览器以后重新打开,再次登录,就会登录失败,并且一直重定向到登录页面(这是我设置的)

img

img

img

img

img

要解决的问题:

  • 如果我继续限制用户登录,有没有办法解决当前的问题?

PS:

  • 我想从sessionManagement(图中做配置那个地方)入手,但那个类被final修饰,好像没有操作空间

我发现你到处问答,别人回答了也不知道正确还是错的,也不采纳。

我理解你的诉求应该是防止多人同时操作一个账号,出现这个问题的原因是因为缺少一个实时的session失效机制,因为直接关闭浏览器不会注销会话,所以服务器并不知道这个用户动作已经结束了,再次登录时会进行阻止。
解决方法可以增加心跳检测机制,比如用户登录后浏览器每隔1s给服务器发送心跳以维持会话,若服务器连续几个心跳周期都没有检测到心跳,则销毁相关会话,一定程度上可以解决这个问题。

spring security默认的行为是如果有第二个登陆的话,就把第一个登陆踢掉。所以不可能出现退出浏览器就不能登陆的问题。
你可以新建一个干净的工程,先确认一下默认行为:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll();
        http.sessionManagement().maximumSessions(1);
    }
}

你现在的情况,很大可能是自己注入的stratedy或者handler造成的。先别进一步去改变框架的行为,先确定问题的根源吧。

既然楼上那么说了,我就来随便回答一下把