spring security - expiredUrl无效

ham*_*med 13 java spring-mvc spring-security

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

@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");

}
Run Code Online (Sandbox Code Playgroud)

这没有任何效果,当用户的会话超时时,spring不会将他重定向到/expiredurl并只是将他重定向到/admin/loginurl.

更新:

我在评论和答案中尝试了建议的解决方案,但没有看到任何影响.我也删除了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;
}
Run Code Online (Sandbox Code Playgroud)

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

ham*_*med 9

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

.sessionManagement().maximumSessions(1).and().invalidSessionUrl("/expired");
Run Code Online (Sandbox Code Playgroud)

正如编码员所说,添加"/expired"允许的网址并解决问题.感谢所有关注我的问题的人,尤其是Ali DehghaniThe Coder,感谢他们的有用评论.


dur*_*dur 8

ConcurrentSessionFilter将重定向到expiredUrl,如果有效会话ID标记为已过期SessionRegistry,请参阅Spring Security参考:

- expired-url如果用户尝试使用并发会话控制器已"过期"的会话,则用户将被重定向到的URL,因为用户已超过允许的会话数并已在其他位置再次登录.除非设置,否则应exception-if-maximum-exceeded设置.如果没有提供任何值,则只会将到期消息直接写回响应.

SessionManagementFilter将重定向到invalidSessionUrl,如果会话ID 无效(超时或错误的ID),请参阅Spring Security参考:

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

两个URL(expiredUrl,invalidSessionUrl)都必须配置为permitAll().

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

并发会话控制

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

<listener>
    <listener-class>
           org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)