spring application-security配置bean扫描

时间:2014-05-19 15:08:35

标签: spring spring-security spring-annotations spring-bean

在我的项目中,我需要一个自定义的userDetailsS​​ervice,所以我在某个包中声明它:

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

在我的application-security.xml文件中,我添加了component-scan,

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

<context:annotation-config />

没有帮助我找到我的注释bean,我没有定义bean的例外。

我的唯一方法是: 1.删​​除服务注释 2.使用beans:bean,id,class在application-security.xml中创建bean。 这很好。

更有趣的是,当我保留组件扫描和注释时,我得到了一个ID重复的ID(多个bean,要求指定ID)错误。

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

所以这意味着@Service确实创建了bean,但是你不知道security.xml找到了它吗?

1 个答案:

答案 0 :(得分:2)

Spring Security是针对UserDetailsService userDetailsService的bean名称自动布线bean。

@Service
public class UserDetailsServiceImpl implements UserDetailsService 

上面的代码(就像你的代码一样)会导致类型为UserDetailsService的bean,但是名称为userDetailsServiceImpl而不是userDetailsService,因此Spring安全套件永远不会使用你的bean也没有被它发现。 (有关命名约定的信息,请参阅Spring Reference Guide

要解决此问题,请将弹簧安全配置和put in a reference更改为userDetailsServiceImpl bean

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

或通过在@Service注释中提供名称来更改bean的名称。

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

无论哪种方式都可行。

<强>链接

  1. Using other authentication providers
  2. Naming autodetected components