java spring boot / spring security(HttpSecurity)中的会话到期时如何自动注销

Posted

技术标签:

【中文标题】java spring boot / spring security(HttpSecurity)中的会话到期时如何自动注销【英文标题】:How to auto-logout when session expire in java spring boot / spring security (HttpSecurity) 【发布时间】:2016-11-11 10:28:30 【问题描述】:

通过自动注销,我的意思是当会话到期时,浏览器将自行重定向到注销 url,而用户无需单击任何将他重定向到注销 url 的链接。

这是我的安全配置:

导入 org.springframework.beans.factory.annotation.Autowired;导入 org.springframework.boot.autoconfigure.security.SecurityProperties;导入 org.springframework.context.annotation.Bean;导入 org.springframework.context.annotation.Configuration;导入 org.springframework.core.annotation.Order;导入 org.springframework.security.access.vote.RoleVoter;导入 org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;导入 org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;导入 org.springframework.security.config.annotation.web.builders.HttpSecurity;导入 org.springframework.security.config.annotation.web.builders.WebSecurity;导入 org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;导入 org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;导入 org.springframework.security.config.http.SessionCreationPolicy;

/**  * Created by plato on 5/5/2016.  */ 

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 公共类 SecurityConfig 扩展 WebSecurityConfigurerAdapter

    @Autowired
    DatabaseAuthenticationProvider authenticationProvider;

    @Override
    public void configure(WebSecurity web) throws Exception 
        web.ignoring().antMatchers("/js/**", "/css/**", "/img/**", "/templates/**", "/thymeleaf/**");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.formLogin()
                .loginPage("/login")
                .failureUrl("/login?failed=true")
                .defaultSuccessUrl("/login-success")
                .and().logout()
                .logoutSuccessUrl("/")
                .and().authorizeRequests()
                .antMatchers("/admin**", "/api/admin/**").hasAuthority("ADMIN")
                .antMatchers("/**")
                .permitAll()
                .anyRequest().authenticated()
                .and().csrf().disable()
                .sessionManagement()
                .maximumSessions(1)
                .expiredUrl("/login?expired-session")
                .and()
                .invalidSessionUrl("/?invalid-session");
    

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth.authenticationProvider(authenticationProvider).eraseCredentials(true);
    
 

【问题讨论】:

会话已超时,没有更多信息,您希望注销后会发生什么? 【参考方案1】:

客户端必须轮询。那里的服务器无法“推送”重定向。

客户端可以每 X 次轮询一次,其中 X 只比会话超时时间长一点。如果轮询比这更频繁,它将刷新会话,因此它永远不会超时。客户端可以在每次用户交互时重置计时器。

【讨论】:

以上是关于java spring boot / spring security(HttpSecurity)中的会话到期时如何自动注销的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 各版本的Java版本要求

java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Boot Starter的介绍及使用

Java高级教程 Java微服务架构(Spring Boot + Spring Cloud)

软帝学院Spring Boot 是什么?为什么说java程序员必须要掌握Spring Boot ?

Spring Boot自动配置原理(转)

java Spring Boot @Scheduled + Spring Security @PreAuthorize = RunAs