java 将JWT筛选器添加到筛选器链时会引发“此对象已生成”错误

bvjxkvbb  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(80)

我使用Sping Boot 3,并有以下问题。
下面是我的filterChain方法:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .addFilter(new JwtUserNameAndPasswordAuthFilter(authManager(http)))
        .authorizeHttpRequests()
            .requestMatchers("/", "/index.html", "/css/*", "/js/*").permitAll()
            .requestMatchers("/api/**").hasRole(STUDENT.name())
            .anyRequest().authenticated();

    return http.build();
}

下面是authManager方法:

@Bean
public AuthenticationManager authManager(HttpSecurity http) throws Exception {
    AuthenticationManagerBuilder authenticationManagerBuilder = http
                                .getSharedObject(AuthenticationManagerBuilder.class);
    authenticationManagerBuilder.authenticationProvider(daoAuthenticationProvider());
    return authenticationManagerBuilder.build();
}

现在,在此设置下,我得到以下错误
工厂方法“filterChain”引发异常,并显示消息:此对象已生成
如果我删除JWT过滤器,它就可以工作。我假设,因为我让构建AuthenticationManager,而在filterChain方法中有另一个构建。
如何在Sping Boot 3下解决这个问题?在filterChain方法中,我需要构建,因为该方法必须返回SecurityFilterChain
我发现this问题,这正是我的问题,但不幸的是,没有答案。

9udxz4iz

9udxz4iz1#

在网上进行了更深入的搜索后,我根据this博客文章找到了答案。
filterChain方法中,我像这样声明了一个authManager

AuthenticationManager authManager = authManager(http);

然后我修改了安全配置如下:

http
    .csrf().disable()
    .authenticationManager(authManager)
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
    .addFilter(new JwtUserNameAndPasswordAuthFilter(authManager))
    .authorizeHttpRequests()
        .requestMatchers("/", "/index.html", "/css/*", "/js/*").permitAll()
        .requestMatchers("/api/**").hasRole(STUDENT.name())
        .anyRequest().authenticated();

现在,它建立。

相关问题