Spring Security:自动装配 ProviderManager

Posted

技术标签:

【中文标题】Spring Security:自动装配 ProviderManager【英文标题】:Spring Security: autowire 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

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于Spring Security:自动装配 ProviderManager的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:自动装配 ProviderManager

使用 Spring Security 的自动装配依赖注入

Spring security 无法自动装配 UserDetailsS​​ervice

Spring Security WebSecurityConfigurerAdapter:AuthenticationManagerBuilder - 覆盖配置方法或自动装配 globalUserDe

Spring Security @PreAuthorize 使用 SpEL 语言访问自动装配的 bean [重复]

无法自动装配字段:私有 org.springframework.security.authentication.AuthenticationManager