2010-07-21 119 views
0

我使用Spring 2.5.6和Spring安全2.0。春季安全 - 春季不檢查isAccountNonLocked爲UserDetails正確登錄

對於登錄嘗試,我在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,如果你在正確的憑據填補他處理這個registerd事件偵聽(做一些東西的好登錄後設置failedLoginAttempts回0)

這是一個錯誤在Spring 2.5.6 ?或者是我忘了的東西...

回答

0

解決了這個問題。

我在Hibernate實體中實現了函數isAccountNonLocked,但我的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>