我正在尝试使用Spring Security以编程方式验证用户登录/传递,因此我需要访问ProviderManager
。我希望它能自动注入我的@Controller
。
我的代码如下:
import org.springframework.security.authentication.ProviderManager;
// ...
@Controller
public class MyController {
@Autowired
private ProviderManager authenticationManager;
但是当我尝试运行应用程序时,我收到此错误消息:
No unique bean of type [org.springframework.security.authentication.ProviderManager] is defined:
expected single matching bean but found 2:
[org.springframework.security.authentication.ProviderManager#0, org.springframework.security.authenticationManager]
可能是什么原因或我如何解决?
我在Spring 3.0.1中使用Spring Security 3.0.0-RC1,我没有定义任何ProviderManager
bean。我成功使用了:
@Resource
private ProviderManager authenticationManager;
在其他项目中,但GAE不支持javax.annotation.Resource
。
答案 0 :(得分:9)
上下文中有两个AuthenticationManager
:
org.springframework.security.authenticationManager
填充了<authentication-manager>
org.springframework.security.authentication.ProviderManager#0
填充了隐式声明的提供者(记住我,匿名等),并将身份验证请求委托给org.springframework.security.authenticationManager
作为后备。所以,我想你需要
@Autowired @Qualifier("org.springframework.security.authenticationManager")
答案 1 :(得分:4)
错误消息消失,包括authentication-manager的别名:
<sec:authentication-manager alias="authenticationManager">
升级到Spring Security 3.0.0结局。