2010-03-07 5 views
1

스프링 보안을 사용하여 프로그래밍 방식으로 사용자 로그인/패스의 유효성을 검사하려고하므로 ProviderManager에 액세스해야합니다. 내 @Controller에 자동으로 주입하고 싶습니다.스프링 보안 : ProviderManager autowire

내 코드는 다음과 같습니다

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] 

은 무엇 원인이 될 수 또는 내가 그것을 어떻게 해결할 수 있습니까?

스프링 3.0.1-RC1을 스프링 3.0.1과 함께 사용하고 있으며 ProviderManager 빈을 정의하지 않았습니다. 다른 프로젝트에서

@Resource 
private ProviderManager authenticationManager; 

,하지만 javax.annotation.Resource는 GAE에서 지원되지 않습니다 : 내가 성공적으로 사용했습니다.

답변

9

이 맥락에서 두 AuthenticationManager의가 있습니다 : 암시 적으로 선언 공급자 (등등 익명, 나를 기억) 및 대의원으로 채워집니다

  • org.springframework.security.authenticationManager입니다 명시 적으로 <authentication-manager>
  • org.springframework.security.authentication.ProviderManager#0에 선언 된 인증 공급자로 채워은 인증 요청은 org.springframework.security.authenticationManager으로 대체됩니다.

그래서, 난 당신이 오류 메시지가 멀리 인증 관리자의 별칭을 포함한 간다

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

감사합니다. @Qualifier 주석을 알지 못했습니다. 문제를 해결하는 것처럼 보이는 "별칭"속성 ()과 관련이 있는지 알고 계십니까? –

+0

@Guido : 네 솔루션은 거의 똑같은 방식으로 작동합니다. '@ 한정자 '는 별명이 필드 이름과 일치하기 때문에 솔루션이 해당 빈을 선택할 때 지정된 이름을 사용하여 빈 중 하나를 선택합니다. – axtavt

4

필요 같아요

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

및 업그레이드 봄 보안 3.0.0 피날레에.