Spring Security中UserDetailsS​​ervice中的问题

时间:2011-05-25 06:39:03

标签: spring spring-security

我正在为Spring安全设置使用自定义的UserDetailsS​​ervice。 自定义UserDetailsS​​ervice只有一个方法覆盖UserDetailsS​​ervice中的loadUserByUsername(最终字符串用户名)。

我在applicationConext-security.xml中的配置如下:

<authentication-manager alias="myAuthenticationManager">
      <authentication-provider user-service-ref="userDetailsService"/>
</authentication-manager>

<beans:bean id="userDetailsService"
    class="temp.com.JpaUserDetailsService" />

但是,当我尝试使用用户名登录时,我收到错误消息,说“”用户名“为争议。我想知道用户名来自哪里,如何避免它为空?

2 个答案:

答案 0 :(得分:2)

有几种可能性,并且由于您没有发布任何堆栈跟踪,因此不清楚问题是否在您的代码或配置中:

  • 您已明确配置过滤器链,并且要么缺少过滤器,要么标准过滤器的顺序错误。
    • 建议:将您的自定义过滤器链(暂时)替换为默认过滤器链并确保其正常工作。
  • 您的自定义UserDetailsS​​ervice中存在错误
    • 建议:使用调试器验证您要传递的用户名。
  • 您的登录表单(假设您使用的是基于表单的身份验证)未使用正确的用户名/密码字段进行设置
    • 建议:j_username和j_password是标准字段名称(除非您已自定义它们)。如果您正在使用JSF,GWT或其他一些破坏字段名称的UI技术,那么您需要考虑到这一点。
  • 您可能还有其他错误配置的内容
    • 建议:删除自定义UserDetailsS​​ervice并将其替换为标准的简单in-memory service,以确保您的基本配置在使用自定义内容进行扩充之前有效。

如果您可以发布完整配置(特别注意您所定制的任何内容),我/我们可以提供更精确的建议,但我建议其中一项最有可能是您的问题。

答案 1 :(得分:-1)

这里您试图将您的userDetailsS​​ervice注入身份验证管理器中的身份验证提供程序,我认为这是不正确的。

应该是这样的:

<bean id="authenticationManager"   
class="org.springframework.security.authentication.ProviderManager">
<property name="providers">
<list>
    <ref local="authenticationProvider" />
</list>
     </property>    
</bean>

<bean id="authenticationProvider" 
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider
">
<property name="userDetailsService" ref="userDetailsService" />     
</bean>

<beans:bean id="userDetailsService"     class="temp.com.JpaUserDetailsService" />