Сканирование bean-компонента конфигурации Spring Application-Security

В моем проекте мне понадобился пользовательский сервис userDetailsService, поэтому я объявляю его следующим образом в определенном пакете:

@Service
@Ihm(name = "userDetailsService")// ignore Ihm, it's just a custom annotation, which works fine
public class UserDetailsServiceImpl implements UserDetailsService 

И в моем файле application-security.xml я добавил компонентное сканирование,

<context:component-scan base-package="path(including the userDetailsService for sure)" />

<context:annotation-config />

который не помог мне найти мой аннотированный компонент, я получил bean без определенного исключения.

В моем случае работал только один способ: 1. удалить аннотацию службы 2. создать bean-компонент в application-security.xml с помощью bean-компонентов: bean, id, class. это работает нормально.

Что еще забавнее, когда я сохранил и компонентное сканирование, и аннотацию, я получил дублированный идентификатор (более одного компонента, попросите указать идентификатор).

 More than one UserDetailsService registered. Please use a specific Id reference in <remember-me/> <openid-login/> or <x509 /> elements.

Итак, это означает, что @Service действительно создал bean-компонент, но y не найдет его в security.xml?


person ROROROOROROR    schedule 19.05.2014    source источник
comment
Опубликуйте трассировку стека и дополнительную конфигурацию. Также при сканировании компонентов имя компонента будет userDetailsServiceImpl. Также <context:annotation-config /> подразумевается использованием <context:component-scan />, поэтому вы, вероятно, захотите удалить это.   -  person M. Deinum    schedule 19.05.2014
comment
спасибо, вы правы, имя bean-компонента действительно userDetailsServiceImpl... не могли бы вы сказать мне y? если имя так, то имя в Сервисе работает только для автопрокачки инъекционных материалов?   -  person ROROROOROROR    schedule 19.05.2014


Ответы (1)


Spring Security - это автоматическая привязка bean-компонентов к именам bean-компонентов, для UserDetailsService, то есть userDetailsService.

@Service
public class UserDetailsServiceImpl implements UserDetailsService 

Приведенный выше код (как и ваш код) приведет к bean-компоненту типа UserDetailsService, однако имя будет userDetailsServiceImpl, а не userDetailsService, и, следовательно, ваш bean-компонент никогда не используется Spring Security и не обнаруживается им. (См. Spring Справочное руководство для соглашений об именах_

Чтобы исправить это, измените конфигурацию безопасности Spring и вставьте ссылку на ваш userDetailsServiceImpl bean-компонент

<authentication-manager>
    <authentication-provider user-service-ref='userDetailsServiceImpl'/>
</authentication-manager>

или измените имя вашего компонента, указав имя в аннотации @Service.

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService 

В любом случае будет работать.

Ссылки

  1. Использование других поставщиков аутентификации
  2. Именование автоматически определяемых компонентов
person M. Deinum    schedule 19.05.2014