Spring安全性 - Spring没有在正确登录时检查isAccountNonLocked for UserDetails

时间:2010-07-21 13:37:41

标签: spring authentication spring-security

我正在使用Spring 2.5.6和Spring security 2.0。

对于登录尝试,我在User类上实现了UserDetails类。所以User类在错误登录后调用isAccountNonLocked()(调度AuthenticationFailureBadCredentialsEvent,我用Eventlistener处理它)Spring从我的User类调用此函数来检查帐户是否被锁定。我实现如下:

public boolean isAccountNonLocked() {
    if (this.getFailedLoginAttempts() >= MAX_FAILED_LOGIN_ATTEMPTS) {  
        return false;  
    }
    return this.accountNonLocked;  
}

这项工作很糟糕,但是当我填写正确的凭据时,他从不会调用此函数。因此,如果您填写正确的凭据,他不会检查用户是否已被锁定,因此即使failedLoginAttempts高于MAX_FAILED_LOGIN_ATTEMPTS或帐户被锁定,他也始终登录。

我甚至实现了AuthenticationSuccessEvent,如果你填写了正确的凭据,他就会处理这个注册的eventlistener(做一些事情,在登录好之后将failedLoginAttempts设置回0)

这是Spring 2.5.6中的错误吗?还是我忘记了......

1 个答案:

答案 0 :(得分:0)

解决了这个问题。

我在isAccountNonLocked实体中实现了函数Hibernate,但我的authenticationDao是JBDC实现而不是HibernateDaoImpl。因此,在自定义实现UserDetails HibernateDaoImpl之后,初始问题就解决了。

public class HibernateDaoImpl extends HibernateDaoSupport implements UserDetailsService {
    private         LoginDao        loginDao;
    private         UserroleDao     userroleDao;


    /* (non-Javadoc)
     * @see org.springframework.security.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
     */
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
        UserDetails login = loginDao.getLogin(username);

        return login;
    }

    /**
     * Loads authorities by executing the authoritiesByUsernameQuery.
     *  
     * @return a list of GrantedAuthority objects for the user
     */
    protected List loadUserAuthorities(String username) {
        return userroleDao.list(username);
    }

    public void setLoginDao(LoginDao loginDao) {
        this.loginDao = loginDao;
    }

    public void setUserroleDao(UserroleDao userroleDao) {
        this.userroleDao = userroleDao;
    }
}

在XML中:

<b:bean id="authenticationDao1" class="com.foo.support.HibernateDaoImpl" >
<b:property name="sessionFactory"><b:ref bean="sessionFactory"/></b:property>
<b:property name="loginDao"><b:ref bean="loginDao"/></b:property>
<b:property name="userroleDao"><b:ref bean="userroleDao"/></b:property>