我正在努力使用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。