【问题标题】:Spring Security: autowire ProviderManagerSpring Security:自动装配 ProviderManager
【发布时间】:2011-01-24 18:55:50
【问题描述】:

我正在尝试使用 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 Security 3.0.0-RC1 与 Spring 3.0.1 一起使用,并且我没有定义任何 ProviderManager bean。我已经成功使用了:

@Resource
private ProviderManager authenticationManager;

在其他项目中,但 GAE 不支持 javax.annotation.Resource

【问题讨论】:

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


    【解决方案1】:

    上下文中有两个AuthenticationManagers:

    • org.springframework.security.authenticationManager 填充了在 <authentication-manager> 中明确声明的身份验证提供程序
    • org.springframework.security.authentication.ProviderManager#0 填充了隐式声明的提供者(记住我,匿名等),并将身份验证请求委托给 org.springframework.security.authenticationManager 作为后备。

    所以,我猜你需要

    @Autowired @Qualifier("org.springframework.security.authenticationManager")
    

    【讨论】:

    • 谢谢,我不知道@Qualifier 注解。你知道它是否与似乎也解决问题的“别名”属性()有关吗?
    • @Guido:是的,您的解决方案的工作方式几乎相同。 @Qualifier 使用指定的名称来选择其中一个 bean,当您的解决方案选择该 bean 时,因为它的别名与字段名称匹配。
    【解决方案2】:

    错误消息消失,包括身份验证管理器的别名:

    <sec:authentication-manager alias="authenticationManager">
    

    并升级到 Spring Security 3.0.0 finale。

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2017-01-19
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2012-07-19
      • 1970-01-01
      相关资源
      最近更新 更多