Spring Security:autowire ProviderManager

时间:2010-03-07 22:22:03

标签: google-app-engine spring-security spring

我正在尝试使用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

2 个答案:

答案 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结局。