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】:上下文中有两个AuthenticationManager
s:
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 无法自动装配 UserDetailsService
Spring Security WebSecurityConfigurerAdapter:AuthenticationManagerBuilder - 覆盖配置方法或自动装配 globalUserDe
Spring Security @PreAuthorize 使用 SpEL 语言访问自动装配的 bean [重复]
无法自动装配字段:私有 org.springframework.security.authentication.AuthenticationManager