将csrf与Spring Security v3.0.0和Thymeleaf配合使用时出现意外错误(类型=禁止,状态=403)

v9tzhpje  于 2022-12-18  发布在  Spring
关注(0)|答案(1)|浏览(158)

我试图配置我的应用程序的安全性,但我得到了“意外错误(类型=禁止,状态=403)”,我不知道是什么问题。我注册了一个用户,然后登录,做了一些事情,在“/设计”页,按提交,并得到错误。正如我所知(从Spring的行动书)Thymeleaf自动包括隐藏字段与CSRF令牌的每一个html页面。
当我在SecurityFilterChain中禁用csrf时,我的Web应用程序工作正常。我的SecurityConfig类如下所示:我只排除H2 Console路径。

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private UserRepository userRepository;

    @Bean
    public UserDetailsService userDetailsService(UserRepository userRepo) {
        return username -> {
            User user = userRepo.findByUsername(username);

            if(user != null) {
                return user;
            }
          throw new UsernameNotFoundException("User \"" + username + "\" not found");
        };
    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().ignoringRequestMatchers(PathRequest.toH2Console())
                .and()
                .headers((headers) -> headers.frameOptions().sameOrigin())
                .authorizeHttpRequests()
                .requestMatchers("/design","/orders").hasRole("USER")
                .requestMatchers("/", "/**").permitAll()
                .and()
                .formLogin(
                        form -> form
                                .loginPage("/login")
                                .loginProcessingUrl("/login")
                                .defaultSuccessUrl("/design")
                                .permitAll()
                ).logout(
                        logout -> logout
                                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                                .permitAll()
                );
        return http.build();
    }
}
s8vozzvw

s8vozzvw1#

感谢@dsp_user。通过添加thymeleaf-extras-springsecurity5依赖项解决了问题

相关问题