将@Component 添加到自定义 Spring Security 过滤器的含义是啥

Posted

技术标签:

【中文标题】将@Component 添加到自定义 Spring Security 过滤器的含义是啥【英文标题】:What is implication of adding @Component to custom Spring Security filter将@Component 添加到自定义 Spring Security 过滤器的含义是什么 【发布时间】:2014-08-14 09:28:02 【问题描述】:

我有一个扩展 GenericFilterBean 的自定义 Spring Security 过滤器。

为了进行自动依赖和 bean 创建,我添加了一个 @Component 注释。

在我的安全配置中,我还注册了过滤器,例如:

@Autowired
private RestAuthenticationFilter restAuthenticationFilter;

protected void configure(HttpSecurity http) throws Exception 
    // @formatter:off
    http
        .addFilterBefore(restAuthenticationFilter, LogoutFilter.class)

一切都很好,除了我的过滤器被调用了两次...... 似乎 Spring 也会自动将过滤器添加到标准过滤器中。

这里最好的方法应该是什么?

更新

@Dave 你是这个意思吗?它似乎有效。

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends WebMvcConfigurerAdapter 

    @Autowired
    private RestAuthenticationFilter restAuthenticationFilter;

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

    @Bean
    public ApplicationSecurity applicationSecurity() 
        return new ApplicationSecurity();
    

    @Bean
    public FilterRegistrationBean filterRegistrationBean() 
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setEnabled(false);
        filterRegistrationBean.setFilter(restAuthenticationFilter);
        return filterRegistrationBean;
    

    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter 

        @Autowired
        private RestAuthenticationFilter restAuthenticationFilter;

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            // @formatter:off
            http
                .addFilterBefore(restAuthenticationFilter, LogoutFilter.class)
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .csrf()
                    .disable()
                .exceptionHandling()
                    .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
                    .and()
                .requestCache()
                    .requestCache(new NullRequestCache())
                    .and()
                .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
            // @formatter:on
        
    

【问题讨论】:

是的,我就是这个意思。 感谢您的确认。通过声明 FilterRegistrationBean @bean 来显式禁用过滤器会让人感觉很讨厌。 我认为理想情况下,过滤器的意图可能可以从标记注释 (@SecurityFilter?) 以及 @Component 中推断出来 - 即 - 在安全链中使用我与使用我在标准过滤器链中。我自己也遇到了类似的问题,因为我的过滤器不需要任何 Bean 资源,我没有将其注册为 @Bean,只是以编程方式注册了一个安全过滤器。 @SecurityFilter 注释听起来很棒!你觉得戴夫怎么样?提交 github 问题? 【参考方案1】:

您需要使用FilterRegistrationBean API 显式注册过滤器并将其标记为“enabled=false”。然后 Spring Security 将在其链中使用它,但 Boot 也不会尝试注册它。

【讨论】:

谢谢戴夫,我试图理解答案......你基本上是说 Spring Boot 会自动添加过滤器,我应该将它注册为 enabled=false 以禁用它行为?我查看了 FilterRegistrationBean apidocs,但不明白如何使用 enabled=false。你可能有一些指针或莫伯知道一些例子吗? 我刚刚注意到RegistrationBean.setEnabled,我会试试这个。 戴夫,请查看我更新后的问题以及我如何解决它的代码。这是你的意思吗?附带说明一下,让 application.property 禁用自动注册 servlet 和过滤器不是更容易吗?在大多数情况下,您不会添加任何自定义 servlet;主要是 Spring Dispatcher servlet 和安全过滤器。 再次在属性文件中编程?就 ApplicationContext 而言,调度程序 servlet 和安全过滤器与任何其他 servlet 和过滤器相同,所以我认为在这种情况下环境设置并不合适。

以上是关于将@Component 添加到自定义 Spring Security 过滤器的含义是啥的主要内容,如果未能解决你的问题,请参考以下文章

将视频添加到自定义照片集合返回错误

传单:如何将文本标签添加到自定义标记图标?

将 UIImageView 添加到自定义 UITableViewCell

将滚动条添加到自定义 QWidget

如何将子视图添加到自定义 UICollectionViewCell

以编程方式将 UILabel 添加到自定义 tableViewCell