0

我正在使用 Spring Security 3。我有自己的身份验证提供程序。

这是我到目前为止所拥有的:

安全应用上下文.xml

<authentication-manager>
    <authentication-provider user-service-ref="detailsService" />    
</authentication-manager>

<beans:bean id="loginSuccessHandler" class="com.myapp.security.LoginSuccessHandler" />
<beans:bean id="loginFailureHandler" class="com.myapp.security.LoginFailureHandler" />
<beans:bean id="detailsService" class="com.myapp.security.UserDetailService" />

用户详细服务

public class UserDetailService implements UserDetailsService {

    private DataSource dataSource;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        String hql = "from Users where username = :username";

        List<Users> list = null;

        try {
            IO io = new IO("common_web");
            IOQuery query = new IOQuery();
            query.setStatement(hql);
            query.setParameter(new IOParameter("username", username));

            list = io.runQuery(query);

            if (list.isEmpty()) {
                return null;
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        // THIS WORKS.  I HAVE A VALID USER FROM DB
        return (UserDetails) list.get(0);
    }
}

这段代码只是一个简单的例子。在“// THIS WORKS...”这一点上,我确实有Users来自我们数据库的记录。但是当我返回这个对象时,我仍然没有通过身份验证。

请注意,这Users是一个 Hibernate 表对象。

我错过了什么?

4

2 回答 2

2

仅仅因为返回了 UserDetails 并不意味着您将通过身份验证。DaoAuthenticationProvider 会进行许多检查以确保返回的用户应该经过身份验证。例如,它确保用户名和密码匹配、帐户未过期、帐户未锁定等。一个常见的问题是返回一个不包含任何 GrantedAuthority 的 UserDetails,这会导致 UsernamePasswordAuthenticationToken 指示用户不是认证。

您是否尝试过为 org.springframework.security 启用调试日志记录?这可以解释什么是错的。如果您不熟悉日志记录,Spring(和 Spring Security)使用 commons-logging,您可以在 Spring 参考中找到日志记录指南。

PS 如 UserDetailsS​​ervice 接口中所述,loadUserByUsername永远不应返回 null。而是抛出一个 UsernameNotFoundException

于 2012-06-07T15:46:53.823 回答
0

由于Users类正在实现UserDetails接口,因此请确保您GrantedAuthority从 getAuthorities 方法返回一个列表而不是 null。此外,其他验证方法应返回适当的值以指示用户有效。例如:

@Override
public List<GrantedAuthority> getAuthorities() {

    return AuthorityUtils.createAuthorityList("VALID_USER_ROLE");
}  
@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}
于 2012-06-08T00:54:14.587 回答