从Spring 3.0.x迁移到3.1.x时出现BadCredentialsException

时间:2012-08-16 12:59:51

标签: java spring spring-security

我们已经从3.0.7 spring security迁移到3.1.2,并且我们使用in-memory-config的一个测试因错误的凭据而失败。

我们不做任何特别的事情,只需用纯文本用户名和密码验证其中一个用户。一旦通过认证,我们就会填补我们的权力。

代码:

public Authentication authenticate(UserDetails userDetails)
        throws AuthenticationException {
    try {
        org.springframework.security.core.Authentication authenticate = authenticationManager.authenticate(createAuthenticationRequest(userDetails));
        if (!authenticate.isAuthenticated()) {
            throw new AuthenticationException("Authentication failed for user ["+userDetails.getUsername()+"]");
        }

        Collection<? extends GrantedAuthority> grantedAuthorities = authenticate.getAuthorities();
                    ...
             } catch(Exception exception) {
        throw new AuthenticationException(exception);
    }

代码:                                                                            

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

<bean id="daoUserDetailsService" class="org.springframework.security.core.userdetails.memory.InMemoryDaoImpl">
    <property name="userMap">
        <value>
            Edward = koala, READ_ONLY
        </value>
    </property>
</bean>

我们在调用身份验证时遇到以下异常:

Caused by: org.springframework.security.authentication.BadCre dentialsException: Bad credentials
at org.springframework.security.authentication.dao.Da oAuthenticationProvider.additionalAuthenticationCh ecks(DaoAuthenticationProvider.java:67)
at org.springframework.security.authentication.dao.Ab stractUserDetailsAuthenticationProvider.authentica te(AbstractUserDetailsAuthenticationProvider.java: 149)
at org.springframework.security.authentication.Provid erManager.authenticate(ProviderManager.java:156)
at org.openspaces.security.spring.SpringSecurityManag er.authenticate(SpringSecurityManager.java:117)
... 11 more

有任何想法如何解决它或是否有一个补丁等待此问题?

2 个答案:

答案 0 :(得分:2)

查看您的配置,它可能是一个空白解析问题,但通过在DaoAuthenticationProvider.additionalAuthenticationChecks中放置一个断点以查看验证失败的原因,它应该很容易调试。

在任何情况下,不推荐使用用于配置内存中用户的属性编辑器方法来支持命名空间配置。你可以使用像

这样的东西
<security:user-service id="daoUserDetailsService">
    <security:user name="Edward" password="koala" authorities="READ_ONLY" />
</security:user-service>

获得相同的结果。当然,您必须add the security namespace到您的应用程序上下文文件。

答案 1 :(得分:0)

以下答案基于Guy Korland的评论(8月16日和12月20日20:40),他做了进一步的调试:

erase-credentials的默认值已从&#39; false&#39;更改为真的&#39;从Spring 3.1开始,这就是为什么你的密码从缓存中拉出时为空的原因。它还解释了为什么您的测试用例在Spring 3.1之前通过。您从缓存中检索的类是UserDetails,一旦Spring验证了未加密的密码,它就不再使用它,因此它将其作为安全措施擦除。对于简单的测试场景,您可以将erase-credentials值覆盖为“假”,但如果您确实在建立身份验证后依赖未加密的值,请考虑长期寻找更安全的解决方案。