2011-05-25 111 views
0

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

我有以下配置applicationConext-security.xml文件:

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

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

然而,当我试图用一个用户名,我得到的错误说的arguement“用户名”为空登录。我想知道用户名从哪里来,我如何避免它为空?

+0

你可以发布JpaUserDetailsS​​ervice吗?它是否实现UserDetailsS​​ervice?它不错过要注入的数据源吗? – abalogh 2011-05-25 08:12:11

回答

2

这有几种可能性,因为你还没有发布任何堆栈跟踪,目前还不清楚,如果这个问题是在你的代码,或配置:

  • 您已明确配置了筛选器链,并且缺少筛选器或按错误顺序排列了标准筛选器。
    • 建议:将您的自定义过滤器链(暂时)替换为默认过滤器链并确保它可以正常工作。
  • 你有一个错误在您的自定义的UserDetailsS​​ervice
    • 建议:使用调试器来验证你的用户名被传递了什么)。
  • 你的登录表单(假设你使用基于表单的认证),未设定了正确的用户名/密码字段
    • 建议:为j_username和为j_password是标准字段名(除非您已定制他们)。如果您使用JSF,GWT或其他一些破坏字段名称的UI技术,则需要对此进行解释。
  • 你可能有别的配置不正确
    • 建议:删除自定义的UserDetailsS​​ervice,并与标准的,简单的,in-memory service取代它,以确保您的基本配置与定制的东西,增强前的作品。

如果你可以发表你的完整配置(特别注意无论您自定义),I /我们可以提供更精确的建议,但我认为这些东西是最有可能是你的问题。

+0

感谢它似乎是该领域的名称的问题。该字段的id是j_username,但名称是其他名称,因此我将其更改为j_username,以便现在可以从该字段获取值。 – newguy 2011-05-26 00:10:58

-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" /> 
+0

这是一个很好的猜测,但它不正确。他/她发布的XML名称空间配置与您拥有的完全相同。要配置一个自定义的'AuthenticationProvider',他/她需要使用'AuthenticationProvider'元素的'ref'属性。 – 2011-05-25 10:43:53

相关问题