2010-03-07 5 views
1

Я пытаюсь программно проверить логин/пароль пользователя с использованием Spring Security, поэтому мне нужно иметь доступ к ProviderManager. Я бы хотел, чтобы он автоматически вводился в мой @Controller.Spring Security: autowire ProviderManager

Мой код выглядит следующим образом:

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; 

в других проектах, но javax.annotation.Resource не поддерживается в GAE.

ответ

9

Там будут два AuthenticationManager s в контексте:

  • org.springframework.security.authenticationManager населен с поставщиками аутентификации явно объявленных в <authentication-manager>
  • org.springframework.security.authentication.ProviderManager#0 заполняется неявно объявленным провайдеров (помните меня, анонимным и так далее) и делегатов запрос аутентификации на org.springframework.security.authenticationManager в качестве резервной копии.

Так что, я думаю, что вам нужно

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

Спасибо, я не знал аннотацию @Qualifier. Знаете ли вы, связано ли это с атрибутом «alias» (), который, похоже, также решает проблему? –

+0

@Guido: Да, ваше решение работает почти так же. '@ Qualifier' использует указанное имя для выбора одного из компонентов, когда ваше решение выбирает этот компонент, потому что его псевдоним соответствует имени поля. – axtavt

4

Сообщение об ошибке уходит, в том числе псевдоним для аутентификации-менеджер:

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

и обновление до Spring Security 3.0.0 финал.

Смежные вопросы