本文主要是介绍Spring Security/logout请求默认跳转到/login?logout解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天用Spring Security写退出登录请求的时候发现怎么弄都匹配不到自己写的/logout请求,反而是会重定向到/login?logout,搜索了一下发现是因为Spring Security默认的退出登录路径也是/logout,这就导致Spring Security不会走自己定义的/logout请求处理,而是走默认的。
解决方案
对于这种情况有两者办法,分别如下:
重新设置退出登录重定向的url
我们可以在security的配置类中这样配置httpSecurity对象:
@Bean
@SuppressWarnings("all")
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {return http.logout().logoutSuccessUrl("需要重定向的url").and().build();
}
这种方法其实并不能解决退出登录后重定向的问题,只是控制退出登录成功后重定向的页面位置,还是会重定向。
自定义LogoutSuccessHandler
我们可以在security的配置类中这样配置HttpSecurity对象:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {return http.logout().permitAll().logoutSuccessHandler((httpServletRequest, httpServletResponse, authentication) -> {// 成功退出登录后返回200状态码// httpServletResponse.setStatus(HttpServletResponse.SC_OK);// 成功退出登录后的需要执行的代码写在这}).and().build();
}
自定义LogoutSuccessHandler后,成功退出登录就会走我们自定义的handler,而不会重定向了。
关于Spring Security默认的退出登录
上面两个方法其实都只是解决退出登录后重定向的问题,如果你根本就不想走Spring Security默认的退出登录处理,可以直接这样设置:
@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {return http// 关闭默认注销接口.logout().disable().build();}
Spring Security提供的/logout做了什么
我们不想走Spring Security默认提供的退出登录处理是因为它可能和我们实际业务并不相符,可能在执行退出登录时还要执行很多别的逻辑,Spring Security默认提供的不一定覆盖得到,不过默认提供的退出登录接口究竟做了什么呢?
在application.yml中设置如下,开启Spring Security的日志功能:
logging:level:org:springframework:security: DEBUG
然后通过走默认提供的退出登录接口,可以看到控制台打印如下:
可以看到默认的退出登录接口做了清空SecurityContext等等操作。其实直接查看logout(Customizer<LogoutConfigurer<HttpSecurity>> logoutCustomizer)的源码注释,会发现官方在注释中给出了详细说明:
关于Spring Security的默认登录页
了解完了Spring Security对/logout请求的默认操作,不妨再来了解一下/login的默认操作。
有时候我们会发现请求/login时也会自动跳转到Spring Security提供的登录页,这是为什么呢?其实这是因为DefaultLoginPageGeneratingFilter和DefaultLogoutPageGeneratingFilter两个filter导致的,如果我们没有配置httpSecurity对象,那么就会用Spring Security自己提供的httpSecurity对象,这个时候就会多配置一些filter,包括UsernamePasswordAuthenticationFilter这个filter,如果我们不取消这个filter,那么其实默认认证登录是不会去数据库里查的。而当我们注入了自己的httpSecurity对象时,就会发现默认的这些filter没有了,也不会出现默认的登录页了。
查看当前应用所有的filter
通过下面方式可以方便查看当前应用所有的filter:
@SpringBootApplication
public class SpringSecurityTokenApplication {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(SpringSecurityTokenApplication.class, args);// 对这一行进行断点调试 查看run对象 // 再通过run.getBean(DefaultSecurityFilterChain.class)这段代码就可以看到所有的filterSystem.out.println();}
}
参考链接
了解这些东西时主要参考了这两个链接:
- Spring Security中如何禁止/logout重定向?
- 怎么禁止Spring Security/logout的重定向。
这篇关于Spring Security/logout请求默认跳转到/login?logout解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!