Spring安全性:会话期满后如果按按钮,则注销不起作用

时间:2018-09-30 18:04:09

标签: spring spring-security csrf

我已经设置了Spring Security来处理登录/注销系统。

如果我登录后又在30分钟内(会话过期前)注销,则注销有效。

如果我登录后31分钟后(会话期满后)注销,则我在浏览器上收到此错误消息:

HTTP Status 405 ? Method Not Allowed
Type Status Report
Message Request method 'POST' not supported
Description The method received in the request-line is known by the origin server but not supported by the target resource.

问题似乎出在 CSRF 系统上。在我的配置中,我启用了登出,并通过提交按钮通过 POST 请求触发来执行注销。由于启用了CSRF系统,因此在我的表单中,有以下一行:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

如果我禁用CSRF系统,则一切正常,如果会话期满后按注销按钮,则不会出现错误。

这是我的配置类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity httpSecurity) throws Exception {

       httpSecurity.formLogin()
            .loginPage("/login")
            .usernameParameter("userId")
            .passwordParameter("password");

       httpSecurity.formLogin()
            .defaultSuccessUrl("/")                 
            .failureHandler(new CustomAuthenticationFailureHandler()); 

       httpSecurity.logout()            
            .logoutSuccessUrl("/login?logout");         

       httpSecurity.exceptionHandling()
            .accessDeniedPage("/login?accessDenied");

       httpSecurity.authorizeRequests()               
            .antMatchers("/").permitAll() 
            .antMatchers("/**/add").access("hasRole('ADMIN')")       
            .antMatchers("/**/market/**").access("hasRole('USER')");  
    }
}

这是我执行注销的方式:

<form method="post" action="<c:url value="/logout" />">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
    <input type="submit" value="Logout">
</form>

有人找到解决这个问题的方法吗?

谢谢

0 个答案:

没有答案