我的Spring安全过滤器链中有一个派生自AbstractPreAuthenticatedProcessingFilter的类。此过滤器的目的是将企业身份验证服务留在特定Principal对象中的角色数据按到Collection中,以便SpringSecurity可以使用它们。
但是,我无法通过此例外:
Caused by: java.lang.IllegalArgumentException: An AuthenticationManager must be set
at org.springframework.util.Assert.notNull(Assert.java:112) ~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.afterPropertiesSet(AbstractPreAuthenticatedProcessingFilter.java:97) ~[spring-security-web-4.0.1.RELEASE.jar:4.0.1.RELEASE]
我使用的是Java配置,而不是XML配置。我的代码遵循How To Inject AuthenticationManager using Java Configuration in a Custom Filter的示例如下:
安全配置器适配器
@Configuration
@EnableWebSecurity
public class MyWebSecurityAdaptor extends WebSecurityConfigurerAdapter {
...
@Bean(name = "myAuthenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
过滤器类本身:
@Component
public class MyPreauthFilter extends AbstractPreAuthenticatedProcessingFilter {
...
@Autowired
@Override
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
}
如果不是上面第1项中的代码,我会尝试以下方法:
@Autowired
@Override
protected AuthenticationManager authenticationManager() throws Exception
{
// TODO Auto-generated method stub
return super.authenticationManager();
}
然后错误发生变化。
然后变成:
引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[org.springframework.security.authentication.AuthenticationManager]的限定bean依赖:预期至少有1个bean有资格作为autowire candidate}
我想这是有道理的,这种方式不会定义bean。但那么为什么DID定义bean的原始方式失败了呢?
答案 0 :(得分:1)
而不是添加' myAuthernticationManager'到WebSecurityConfigurerAdapter类。将它直接添加到过滤器类并自动装配它。
@Autowired
@Override
public void setMyAuthenticationManager(MyAuthenticationManager myAuthenticationManager) {
this.myAuthenticationManager = myAuthenticationManager;
super.setAuthenticationManager(this.myAuthenticationManager);
}
从WebSecurityConfigurerAdapter中删除与myAuthenticationManager相关的所有代码。