WebSecurityConfigurerAdapter

WebSecurityConfigurerAdapter

我有2个类扩展了WebSecurityConfigurerAdapter。并且不能让他们一起工作。

这个想法如下:

  • 有一个WebSecurityConfigurerAdapter,仅将自定义过滤器添加到安全链。过滤器执行一些自定义身份验证,并将Authentication保存到SecurityContext中。这通常可以正常工作。配置如下(省略导入):

  •  @Order(1)
     @Configuration
     @EnableWebMvcSecurity
     public class BestSecurityConfig extends WebSecurityConfigurerAdapter {
    
         @Autowired
         private BestPreAuthenticationFilter ssoAuthenticationFilter;
    
         @Bean
         protected FilterRegistrationBean getSSOAuthenticationFilter() {
             FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(ssoAuthenticationFilter);
    
             // Avoid include to the default chain
             filterRegistrationBean.setEnabled(false);
    
             return filterRegistrationBean;
         }
    
         @Override
         protected void configure(HttpSecurity http) throws Exception {
             http
                .addFilterAfter(ssoAuthenticationFilter, SecurityContextPersistenceFilter.class);
    
         }
    
         @Configuration
         protected static class AuthenticationConfiguration extends
                 GlobalAuthenticationConfigurerAdapter {
    
             @Autowired
             private BestAuthenticationProvider authenticationProvider;
    
             @Override
             public void configure(AuthenticationManagerBuilder auth) throws Exception {
                 auth.authenticationProvider(authenticationProvider);
             }
         }
     }
    
  • 我希望以上内容是任何人都可以通过@ComponentScan包含并获得自定义身份验证排序的库类。显然,他们希望提供自定义的HttpSecurity以保护编辑点。尝试类似:

  •  @Configuration
     @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
     @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
     public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
         @Override
         protected void configure(HttpSecurity http) throws Exception {
             http
                 .csrf().disable()
                 .authorizeRequests()
                 .antMatchers("/testUrl").hasRole("NON_EXISTING")
                 .anyRequest().authenticated();
         }
     }
    

    显然,由于我的用户不是NON_EXISTING角色的成员,因此不应访问测试URL。不幸的是她。

    如果将安全性authorizeRequests()部分移至配置类形式1。在添加安全性过滤器旁边,则它将按预期阻止访问。但是在我看来,第二种配置似乎被忽略了。

    我还调试了configure()方法,并注意到HttpSecurity不是同一个对象,它散发出一点气味。

    任何提示如何使我的工作倍受赞赏。

    总结目标:
  • 有一个WebSecurityConfigurerAdapter,它添加了过滤器,并被库
  • 的用户隐藏
  • 让用户定义自己的自定义端点安全性

  • Spring Boot 1.1.6-发布

    最佳答案

    定义一个特殊的接口(interface)

    public interface ServiceWebSecurityConfigurer {
        void configure(HttpSecurity http) throws Exception;
    }
    

    然后只有一个ConfigurerAdapter:

    public class MyConfigurerAdapter extends WebSecurityConfigurerAdapter {
    
        @Autowired(required = false)
        ServiceWebSecurityConfigurer serviceSecConfig;
    
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests(). // whatever
    
            if (serviceSecConfig != null) serviceSecConfig.configure(http);
    
            http.authorizeRequests(). // whatever
        }
    }
    

    然后在需要时在其他地方实现ServiceWebSecurityConfigurer。也可以有多种实现,只需将它们自动连接为列表,然后迭代并在您的主要配置中使用它们即可。

    10-07 20:14