Spring Security:具有多个AuthenticationManagers的多个http元素

时间:2017-12-22 19:41:23

标签: spring-boot spring-security

我正在努力使用Java Config for Spring Security。我有多个入口点,但我无法正确配置AuthenticationManager

我的第一个配置文件是这样的:

@Configuration
@EnableWebSecurity
@Order(100)
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .antMatcher("/service/**")
            .addFilterAfter(requestHeaderAuthenticationFilter(), SecurityContextPersistenceFilter.class)
                .authorizeRequests()
                .antMatchers("/service/**").authenticated()
            .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
            .and()
                .csrf().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.authenticationProvider(preAuthenticatedAuthenticationProvider(null));
    }

@Bean
public RequestHeaderAuthenticationFilter requestHeaderAuthenticationFilter() throws Exception
{
    // Takes the value of the specified header as the user principal
    RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter();
    filter.setPrincipalRequestHeader("SECRET_HEADER");
    filter.setAuthenticationManager(authenticationManager());
    filter.setExceptionIfHeaderMissing(false);
    return filter;
}

这一切都正常。当我在RequestHeaderAuthenticationFilter中设置断点时,我看到AuthenticationManager有一个AuthenticationProvider,那就是preAuthenticatedAuthenticationProvider(未显示,因为它只是一个普通的老豆)。< / p>

我还为管理员用户提供了一个特殊的安全链:

@Configuration
@Order(101)
public class AdminSecurity extends WebSecurityConfigurerAdapter
{

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .authenticationProvider(mainSiteLoginAuthenticationProvider())
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .antMatchers("/admin/**").access("SECRET ADMIN ACCESS EXPRESSION")
                .antMatchers("/internal/**").access("SECRET INTERNAL ACCESS EXPRESSION")
                .anyRequest().permitAll()
                .and()
            .formLogin()
                .defaultSuccessUrl("/admin/thing")
                .loginPage("/login")
                .loginProcessingUrl("/do_login")
                .defaultSuccessUrl("/admin/thing")
                .failureUrl("/login?error=true")
                .usernameParameter("username")
                .passwordParameter("password")
                .and()
            .logout()
                .and()
            .exceptionHandling()
                //.authenticationEntryPoint(null) // entry-point-ref="loginEntryPoint"
                .and()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)  // create-session="ifRequired"
                .and()
            .csrf().disable();
    }

这现在正在工作(经过很多努力),但是如果我在UsernamePasswordAuthenticationFilter中放置一个断点,我看到这个过滤器有一个不同的AuthenticationManager实例,它配置了{ {1}}如预期的那样。但是,它有一个 mainSiteLoginAuthenticationProvider,配置了默认的AuthenticationManager,可以在日志中生成临时密码:

DaoAuthenticationProvider

所以我的问题是:

  • 如何让两个安全配置使用相同的Using default security password: 47032daf-813e-4da1-a224-b6014a705805 ?我认为订单为100的AuthenticationManager会创建一个,然后SecurityConfig为101,只会使用它。但是我无法让他们使用相同的AdminConfig
  • 如果失败,如何阻止AuthenticationManager AuthenticationManger生成具有默认AdminConfig的父级?

我正在使用Spring Boot 1.5.9.RELEASE,这意味着Spring Security 4.2.3.RELEASE。

0 个答案:

没有答案