弹簧安全性 - 过期Url不起作用

2022-09-04 01:44:37

我需要在我的Spring MVC应用程序中进行配置。这是我的努力,但没有效果:expired-url

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(adminAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
        .addFilterBefore(customerAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers("...", "...", "...").permitAll()
            .anyRequest().authenticated()
        .and()
            .formLogin()
                .loginPage("/admin/login")
        .and()
            .logout()
                .addLogoutHandler(customLogoutHandler())
                .logoutSuccessHandler(customLogoutSuccessHandler())
                .logoutUrl("/logout")
        .deleteCookies("remove")
        .invalidateHttpSession(true)
            .permitAll()
        .and()
        .sessionManagement()
            .maximumSessions(1)
            .expiredUrl("/expired");

}

这没有任何影响,当用户的会话超时时,spring不会将他重定向到url,而只是将他重定向到url。/expired/admin/login

更新:

我在评论和答案中尝试了建议的解决方案,但没有看到任何效果。我也删除了,和两个在方法开始时,但不起作用。addLogoutHandler()logoutSuccessHandler()addFilterBefore()

我也尝试了另一种解决方案:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(sessionManagementFilter(), SessionManagementFilter.class)
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers("...", "...", "...").permitAll()
            .anyRequest().authenticated()
        .and()
            .formLogin()
                .loginPage("/admin/login")
        .and()
            .logout()
                .logoutUrl("/logout")
        .deleteCookies("remove")
        .invalidateHttpSession(true)
            .permitAll();
}

@Bean
public SessionManagementFilter sessionManagementFilter() {
    SessionManagementFilter sessionManagementFilter = new SessionManagementFilter(httpSessionSecurityContextRepository());
    sessionManagementFilter.setInvalidSessionStrategy(simpleRedirectInvalidSessionStrategy());
    return sessionManagementFilter;
}

@Bean
public SimpleRedirectInvalidSessionStrategy simpleRedirectInvalidSessionStrategy() {
    SimpleRedirectInvalidSessionStrategy simpleRedirectInvalidSessionStrategy = new SimpleRedirectInvalidSessionStrategy("/expired");
    return simpleRedirectInvalidSessionStrategy;
}

@Bean
public HttpSessionSecurityContextRepository httpSessionSecurityContextRepository(){
    HttpSessionSecurityContextRepository httpSessionSecurityContextRepository = new HttpSessionSecurityContextRepository();
    return httpSessionSecurityContextRepository;
}

任何人都可以帮我解决这个问题吗?


答案 1

如果会话注册表中的有效会话 ID 标记为已过期,则并发会话筛选器将重定向到 ,请参阅 Spring 安全参考expiredUrl

- 过期网址如果用户尝试使用已由并发会话控制器“过期”的会话,因为该用户已超过允许的会话数并在其他地方再次登录,则该用户将被重定向到该 URL。除非设置,否则应设置。如果未提供任何值,则到期消息将直接写回响应。exception-if-maximum-exceeded

会话管理筛选器将重定向到 ,如果会话 ID 无效(超时或 ID 错误),请参阅 Spring 安全参考invalidSessionUrl

如果用户当前未通过身份验证,则筛选器将检查是否请求了无效的会话 ID(例如,由于超时),并将调用配置的 ,如果设置了会话 ID。最常见的行为只是重定向到固定的URL,这封装在 标准实现 中 。如前所述,在通过命名空间配置无效的会话 URL 时,也会使用后者。InvalidSessionStrategySimpleRedirectInvalidSessionStrategy

两个 URL (, ) 都必须配置为 。expiredUrlinvalidSessionUrlpermitAll()

顺便说一句:如果你想使用并发会话控制,你必须将HttpSessionEventPublisher添加到你的:maximumSessionsweb.xml

并发会话控制

如果您希望对单个用户登录应用程序的能力施加限制,Spring Security通过以下简单的添加功能支持开箱即用。首先,您需要将以下侦听器添加到文件中,以使Spring Security更新会话生命周期事件:web.xml

<listener>
    <listener-class>
           org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

答案 2

我以这种方式尝试了Ali Dehghani的解决方案(在评论中):

.sessionManagement().maximumSessions(1).and().invalidSessionUrl("/expired");

正如The Coder所说,添加允许的URL并解决问题。感谢所有关注我的问题的人,特别是Ali DehghaniThe Coder,感谢他们有用的评论。"/expired"


推荐