Hibernate 为什么我的loadUserByUsername不工作?

Hibernate 为什么我的loadUserByUsername不工作?,hibernate,authentication,spring-mvc,spring-security,Hibernate,Authentication,Spring Mvc,Spring Security,我正在使用SpringSecurity3。我有自己的身份验证提供商 以下是我到目前为止的情况: 安全应用程序上下文.xml <authentication-manager> <authentication-provider user-service-ref="detailsService" /> </authentication-manager> <beans:bean id="loginSuccessHandler" class="c

我正在使用SpringSecurity3。我有自己的身份验证提供商

以下是我到目前为止的情况:

安全应用程序上下文.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" />

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);
    }
}
公共类UserDetailService实现UserDetailsService{
私有数据源;
@凌驾
public UserDetails loadUserByUsername(字符串用户名)引发UsernameNotFoundException{
String hql=“来自username=:username的用户”;
List=null;
试一试{
IO=新IO(“公共网络”);
IOQuery=新IOQuery();
查询.设置报表(hql);
setParameter(新的IOParameter(“用户名”,username));
list=io.runQuery(查询);
if(list.isEmpty()){
返回null;
}
}捕获(例外情况除外){
例如printStackTrace();
}
//这是有效的。我有一个来自DB的有效用户
返回(用户详细信息)列表。获取(0);
}
}
这段代码只是一个简单的例子。在“//THIS WORKS…”这一点上,我确实从我们的数据库中获得了一个
Users
记录。但是当我返回这个对象时,我仍然没有被验证

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


我遗漏了什么?

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

您是否尝试过为org.springframework.security启用调试日志记录?这或许可以解释问题所在。如果您不熟悉日志记录,Spring(和Spring安全性)将使用commons日志记录,您可以在Spring参考中找到


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

@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;
}
@覆盖
公共机构名单(){
返回AuthorityUtils.createAuthorityList(“有效的用户角色”);
}  
@凌驾
公共布尔值IsAccountNoExpired(){
返回true;
}
@凌驾
公共布尔值isAccountNonLocked(){
返回true;
}
@凌驾
公共布尔值isCredentialsNonExpired(){
返回true;
}
@凌驾
公共布尔值isEnabled(){
返回true;
}