Java Spring安全认证管理器赢得';不要在自定义过滤器上拾取
我试图创建一个自定义过滤器来处理身份验证,因为我被迫使用AD和本地数据库(arg!)的组合来确定访问权限。我用的是官方文件,主要是针对这个问题 然而,当我运行我的服务器时,它抱怨AuthenticationManager为空,而我相信我是在用XML设置它。我错过了什么 例外情况:Java Spring安全认证管理器赢得';不要在自定义过滤器上拾取,java,spring,spring-security,Java,Spring,Spring Security,我试图创建一个自定义过滤器来处理身份验证,因为我被迫使用AD和本地数据库(arg!)的组合来确定访问权限。我用的是官方文件,主要是针对这个问题 然而,当我运行我的服务器时,它抱怨AuthenticationManager为空,而我相信我是在用XML设置它。我错过了什么 例外情况: SEVERE: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating
SEVERE: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myUsernamePasswordAuthenticationFilter' defined in file [*snip*]:
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: authenticationManager must be specified
...
Caused by: java.lang.IllegalArgumentException: authenticationManager must be specified
at org.springframework.util.Assert.notNull(Assert.java:112)
@Component
public class MyUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
public AdminUsernamePasswordAuthenticationFilter() {
super("/login");
}
@Override
public Authentication attemptAuthentication(final HttpServletRequest request,
final HttpServletResponse response) throws AuthenticationException {
// stuff and:
return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(
login, request.getParameter("password")));
}
}
@Component
public class MyAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
// all the funky AD+DB code
return null;
}
@Override
public boolean supports(final Class<?> clazz) {
return true;
}
}
XML:(带有一些简化的类名)
身份验证提供程序:
SEVERE: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myUsernamePasswordAuthenticationFilter' defined in file [*snip*]:
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: authenticationManager must be specified
...
Caused by: java.lang.IllegalArgumentException: authenticationManager must be specified
at org.springframework.util.Assert.notNull(Assert.java:112)
@Component
public class MyUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
public AdminUsernamePasswordAuthenticationFilter() {
super("/login");
}
@Override
public Authentication attemptAuthentication(final HttpServletRequest request,
final HttpServletResponse response) throws AuthenticationException {
// stuff and:
return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(
login, request.getParameter("password")));
}
}
@Component
public class MyAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
// all the funky AD+DB code
return null;
}
@Override
public boolean supports(final Class<?> clazz) {
return true;
}
}
@组件
公共类MyAuthenticationProvider实现AuthenticationProvider{
@凌驾
公共身份验证(最终身份验证)引发AuthenticationException{
//所有时髦的AD+DB代码
返回null;
}
@凌驾
公共布尔支持(最终类clazz){
返回true;
}
}
我正在运行Java6,它是最新的Spring安全性(3.1.4.RELEASE)和Spring(3.2.3.RELEASE)版本,运行在TomcatV6服务器上。不同的Spring版本似乎不是问题()。如果这是一个问题,如果你想使用Spring安全性,就必须运行Spring 3.1.4,这很简单
我还做了一些其他事情,但没有成功:
,转而使用普通bean啊。。。我发现了许多人在春天犯下的基本错误。您已经在XML中定义了bean
MyUsernamePasswordAuthenticationFilter
,这是正确的。然而,您也可以通过@Component
注释对其进行注释,这意味着组件扫描将其拾取并注册为另一个bean定义。从这个定义提交的bean实例实际上不会初始化其authenticationManager
依赖项
只需删除
MyUsernamePasswordAuthenticationFilter
中的@组件
注释,您就可以了。是的,就是这样。非常感谢。我真不敢相信我错过了这样的机会。我希望你不要对着墙大喊大叫和挥手太久。