我已经设置了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>
有人找到解决这个问题的方法吗?
谢谢