0

在我的项目中,我需要一个自定义的 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 文件中,我添加了组件扫描,

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

<context:annotation-config />

这并没有帮助我找到带注释的 bean,我得到了 bean 没有定义的异常。

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

更有趣的是,当我同时保留组件扫描和注释时,我得到了一个 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 中找到它?

4

1 回答 1

2

Spring Security 是在 bean 名称上自动连接 bean,UserDetailsService因为userDetailsService.

@Service
public class UserDetailsServiceImpl implements UserDetailsService 

上面的代码(就像你的代码一样)将导致一个类型的 bean,UserDetailsService但是名称是userDetailsServiceImpl,而不是userDetailsService,因此你的 bean 永远不会被 Spring Security 使用,也不会被它检测到。(有关命名约定,请参阅 Spring参考指南_

要解决此问题,请更改 spring 安全配置并引用您的userDetailsServiceImplbean

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

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

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

无论哪种方式都会奏效。

链接

  1. 使用其他身份验证提供程序
  2. 命名自动检测到的组件
于 2014-05-19T17:48:58.127 回答