Java 拒绝使用已通过身份验证的会话登录

Java 拒绝使用已通过身份验证的会话登录,java,spring-security,Java,Spring Security,如何拒绝已通过身份验证的HTTP会话的第二次登录(使用相同或不同的用户) 因为我发现了以下解决方法: 但这些解决方法并不完美,因为我仍然可以访问登录处理url,并执行第二次登录。这对于没有登录页面的所有身份验证机制来说都是一个问题,如和 我的Java配置: @Configuration @EnableWebSecurity public static class MyWebSecurityConfigurationAdapter extends WebSecurityConfigure

如何拒绝已通过身份验证的HTTP会话的第二次登录(使用相同或不同的用户)

因为我发现了以下解决方法:

但这些解决方法并不完美,因为我仍然可以访问
登录处理url
,并执行第二次登录。这对于没有登录页面的所有身份验证机制来说都是一个问题,如和

我的Java配置:

@Configuration
@EnableWebSecurity
public static class MyWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/**").hasAuthority("ROLE_user")
                .and()
            .formLogin()
                .loginProcessingUrl("/Login").permitAll()
                .loginPage("/index.jsp").permitAll()
                .defaultSuccessUrl("start.jsp")
                .failureUrl("/index.jsp")
                .and()
            .httpBasic();
    }
}
例如:

  • 用户A:使用HTTP基本身份验证登录
  • 系统:创建会话并返回会话cookie
  • 用户B:在同一台计算机上使用HTTP基本身份验证登录并发送会话cookie
  • 系统:创建新会话,将旧会话中的所有值合并到新会话中(请参阅),销毁旧会话并返回新会话cookie
    将以下条目放入web.xml中

    <listener>
      <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>
    
    
    org.springframework.security.web.session.HttpSessionEventPublisher
    
    在spring安全配置中,使用以下代码段:

    <http>
      <session-management>
        <concurrency-control max-sessions="1" expired-url="/redirect-page" />
      </session-management>
    </http>
    

    将以下条目放入web.xml

    <listener>
      <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>
    
    
    org.springframework.security.web.session.HttpSessionEventPublisher
    
    在spring安全配置中,使用以下代码段:

    <http>
      <session-management>
        <concurrency-control max-sessions="1" expired-url="/redirect-page" />
      </session-management>
    </http>
    
    
    
    您的解决方案有两个缺点:1。用户不能使用单独的会话登录两次。2.它只适用于同一用户,不同的用户仍然可以使用相同的会话。我会更新我的问题,让它更清楚。Deinum:当然,我在登录后会通过身份验证,但会与其他用户进行身份验证。这就是问题所在。我不想与用户共享会话(或合并)。您的解决方案有两个缺点:1。用户不能使用单独的会话登录两次。2.它只适用于同一用户,不同的用户仍然可以使用相同的会话。我会更新我的问题,让它更清楚。Deinum:当然,我在登录后会通过身份验证,但会与其他用户进行身份验证。这就是问题所在。我不想与用户共享会话(或合并)。请实施自定义
    SessionAuthenticationStrategy
    @Aleksandr M:谢谢。也许我可以检查会话是否已经通过身份验证并引发异常。但目前我不确定在FILTER chaein中的
    BASIC\u AUTH\u FILTER
    之前是否执行了
    SessionAuthenticationStrategy
    。我将阅读Spring安全参考并尝试实现它。实现自定义
    SessionAuthenticationStrategy
    @Aleksandr M:谢谢。也许我可以检查会话是否已经通过身份验证并引发异常。但目前我不确定在FILTER chaein中的
    BASIC\u AUTH\u FILTER
    之前是否执行了
    SessionAuthenticationStrategy
    。我将阅读Spring安全参考并尝试实现它。