具有自定义身份验证过滤器的WebSecurityConfigurerAdapter - 依赖性问题

时间:2016-08-31 21:12:15

标签: java spring authentication spring-security

我有SPNEGO的弹簧安全配置,它正在“与黑客”一起工作。它看起来如下:

@Configuration
@EnableWebSecurity
public class SpnegoConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                ...
                .addFilterBefore(
                        spnegoAuthenticationProcessingFilter(authenticationManagerBean()),
                        BasicAuthenticationFilter.class); // 1
    }

    @Override
    @Autowired // 3
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        auth
                .authenticationProvider(kerberosAuthenticationProvider())
                .authenticationProvider(kerberosServiceAuthenticationProvider());
    }


    @Bean
    public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter(
            AuthenticationManager authenticationManager) { // 2
        SpnegoAuthenticationProcessingFilter filter =
                new SpnegoAuthenticationProcessingFilter();
        filter.setAuthenticationManager(authenticationManager);
        return filter;
    }
    ...
}

发生了什么:

  • 我需要添加spnegoAuthenticationProcessingFilter(1)
  • 此过滤器依赖于authenticationManager(2)
  • 我需要添加身份验证提供程序(3)

点在这个类中WebSecurityConfigurerAdapter我正在覆盖2个方法:

  1. configure(HttpSecurity http) - 这依赖于已经构建的AuthenticationManager到自定义过滤器
  2. configure(AuthenticationManagerBuilder auth) - 这显然与AuthenticationManager尚未建成有关 - 我们正在建设
  3. 如果方法(3)上没有@Autowired AuthenticationManager,则AuthenticationProvider过早构建,添加AuthenticationProvider s无效。身份验证失败,但没有合适的@Autowired

    如果AuthenticationManager到位,它会起作用,但如果感觉不对。我甚至不确定它为什么会开始工作。

    请就正确的方法提出建议。

    编辑:实际上没有@Autowired。但重点是接受的答案。如果您依赖于@Configuration authenticationManagerBean(),请确保通过Mode Time Air 2 Sea 4 Air 5 Sea 6 方法公开或引用它。

1 个答案:

答案 0 :(得分:2)

您使用了错误的AuthenticationManager

如果您想使用AuthenticationManager SpnegoConfig进行依赖注入,则必须公开它,请参阅JavaDoc

  

重写此方法以使Authentication(AuthenticationManagerBuilder)中的AuthenticationManager公开为Bean。例如:

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

如果您要配置全局AuthenticationManager,则必须自动装配AuthenticationMangerBuilder,请参阅Spring Security 3.2.0.RC2 Released

  

例如,如果要配置全局身份验证(即只有一个AuthenticationManager),则应自动连接AuthenticationMangerBuilder:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
   // ... configure it ...
}