在 Spring 引导应用程序中配置 Spring 安全性时,如何在没有 @Configuration 的 class 中使用 @Bean?

How @Bean is used in a class without @Configuration when configuring Spring Security in a Spring Boot app?

我正在了解 Spring 启动应用程序中的安全性。我知道您只需要在@Configuration class 中使用@Bean。但是我看到这个配置示例 Spring Security 并且 @Bean 在没有 @Configuration 的 class 中使用。这怎么可能?谢谢!

@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyUserDetailsService myUserDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests().antMatchers("/authenticate").permitAll()
                .anyRequest().authenticated();
    }

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

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
} 

当你遇到这种情况时,请查看文档,这里 @Bean 文档你可以看到在 @Configuration 中使用 @Bean 不是强制性的 class:

@Bean methods may also be declared within classes that are not annotated with @Configuration. For example, bean methods may be declared in a @Component class or even in a plain old class.

如果你也看一下 @EnableWebSecurity doc 你会发现它包括 @Configuration.

编辑:提示

对于 Spring 引导应用程序,当我们使用 @EnableWebSecurity 时,我们会禁用安全性 auto-configuration,因此最好简单地执行以下操作:

@Configuration
// @Order(...)   we can set the order of the filter chain
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {
      // configuration here
}

在这种情况下,我们保留 Spring Boot 提供的配置 + 我们自己的配置。