当在Spring Security 6中使用securityMatcher时,Default /logout不起作用

szqfcxe2  于 2024-01-06  发布在  Spring
关注(0)|答案(1)|浏览(157)

在Spring Security 6中,(特别是Sping Boot 3.2,在我的情况下是Spring MVC with Thymeleaf)当使用securityMatcher时,默认/注销POST或GET停止工作。

  1. @Bean
  2. public SecurityFilterChain openFilterChain(HttpSecurity http) throws Exception {
  3. http.securityMatcher("/EParticipate/baudit/**")
  4. .addFilterBefore(new BauditUsernamePasswordAuthenticationFilter(
  5. this.authenticationManager(userDetailsService, passwordEncoder())),
  6. UsernamePasswordAuthenticationFilter.class
  7. )
  8. .authorizeHttpRequests((requests) -> requests
  9. .dispatcherTypeMatchers(DispatcherType.FORWARD, DispatcherType.ERROR).permitAll()
  10. .requestMatchers("/EParticipate/baudit/**").hasRole("BAUDIT")
  11. .requestMatchers("/EParticipateSecurity/**").permitAll()
  12. )
  13. .authenticationManager(this.authenticationManager(userDetailsService, passwordEncoder()))
  14. .formLogin(form -> form
  15. .loginPage("/EParticipateSecurity/login_request").permitAll()
  16. .defaultSuccessUrl("/EParticipate/baudit")
  17. )
  18. return http.build();
  19. }

字符串
Thymeleaf中的POST链接:

  1. <form id="logout_form" th:action="@{/logout}" method="POST">
  2. <button id="logout_button" type="submit">Logout</button>
  3. </form>


即使您将permitAll()添加到requestMatcher,它仍然无法工作:

  1. @Bean
  2. public SecurityFilterChain openFilterChain(HttpSecurity http) throws Exception {
  3. http.securityMatcher("/EParticipate/baudit/**")
  4. .addFilterBefore(new BauditUsernamePasswordAuthenticationFilter(
  5. this.authenticationManager(userDetailsService, passwordEncoder())),
  6. UsernamePasswordAuthenticationFilter.class
  7. )
  8. .authorizeHttpRequests((requests) -> requests
  9. .dispatcherTypeMatchers(DispatcherType.FORWARD, DispatcherType.ERROR).permitAll()
  10. .requestMatchers("/EParticipate/baudit/**").hasRole("BAUDIT")
  11. //Doesn't work
  12. .requestMatchers("/EParticipateSecurity/**","/logout").permitAll()
  13. )
  14. .authenticationManager(this.authenticationManager(userDetailsService, passwordEncoder()))
  15. .formLogin(form -> form
  16. .loginPage("/EParticipateSecurity/login_request").permitAll()
  17. .defaultSuccessUrl("/EParticipate/baudit")
  18. )
  19. return http.build();
  20. }

rnmwe5a2

rnmwe5a21#

为了解决这个问题,我必须在securityMatcher的URL下添加一个自定义注销作为子URL(我还添加了一个注销处理程序,以确保注销时清除所有内容)。

  1. @Bean
  2. public SecurityFilterChain openFilterChain(HttpSecurity http) throws Exception {
  3. http.securityMatcher("/EParticipate/baudit/**")
  4. .addFilterBefore(new BauditUsernamePasswordAuthenticationFilter(
  5. this.authenticationManager(userDetailsService, passwordEncoder())),
  6. UsernamePasswordAuthenticationFilter.class
  7. )
  8. .authorizeHttpRequests((requests) -> requests
  9. .dispatcherTypeMatchers(DispatcherType.FORWARD, DispatcherType.ERROR).permitAll()
  10. .requestMatchers("/EParticipate/baudit/**").hasRole("BAUDIT")
  11. .requestMatchers("/EParticipateSecurity/**").permitAll()
  12. )
  13. .authenticationManager(this.authenticationManager(userDetailsService, passwordEncoder()))
  14. .formLogin(form -> form
  15. .loginPage("/EParticipateSecurity/login_request").permitAll()
  16. .defaultSuccessUrl("/EParticipate/baudit")
  17. )
  18. .logout((logout) -> logout
  19. .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(Directive.CACHE,Directive.COOKIES,Directive.EXECUTION_CONTEXTS,Directive.STORAGE)))
  20. .logoutUrl("/EParticipate/baudit/logout")//URL under the securityMatcher URL above
  21. .logoutSuccessUrl("/EParticipateSecurity/login_request").permitAll()
  22. );
  23. return http.build();
  24. }

字符串

展开查看全部

相关问题