0

我们已经从 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

有什么想法可以解决它,或者是否有补丁解决这个问题?

4

2 回答 2

2

DaoAuthenticationProvider.additionalAuthenticationChecks查看您的配置,这可能是一个空格解析问题,但通过放置断点来查看身份验证失败的原因应该很容易进行调试。

在任何情况下,配置内存用户的属性编辑器方法已被弃用,取而代之的是命名空间配置。你可以使用类似的东西

<security:user-service id="daoUserDetailsService">
    <security:user name="Edward" password="koala" authorities="READ_ONLY" />
</security:user-service>

得到相同的结果。当然,您必须将安全命名空间添加到您的应用程序上下文文件中。

于 2012-08-16T13:35:40.677 回答
0

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

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

于 2014-06-19T03:21:02.473 回答