我们通过配置HttpSecurity
来实现这样的维护模式。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(publicResources).permitAll()
.antMatchers("/config/**","/config").hasRole("ADMIN")
/*--- Mainenance mode ---*/
.requestMatchers(request -> systemManagement.inMaintenance()).hasRole("ADMIN")
.anyRequest().hasRole("USER")
.and()
.exceptionHandling()
.accessDeniedHandler((request, response, accessDeniedException) ->
accessDeniedHandler().handle(request, response, accessDeniedException)
)
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout().permitAll()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
;
}
@Bean
public AccessDeniedHandler accessDeniedHandler() {
AccessDeniedHandlerImpl defaultAccessDeniedHandler = new AccessDeniedHandlerImpl();
defaultAccessDeniedHandler.setErrorPage("/login?error");
return defaultAccessDeniedHandler;
}
现在,在维护处于活动状态时,普通用户现在可以将GET请求重定向到登录名。那是预期的结果。但是,普通用户的POST请求在维护期间导致405(不允许使用方法)。
我注意到csrf保护处于活动状态,并且405经常是由于Spring Boot中缺少csrf令牌导致的。可以在授权之前检查csrf吗?如果是这样,我可以更改吗?还是完全不同的问题?