代码之家  ›  专栏  ›  技术社区  ›  Michel

Spring安全性-Spring不会检查isAccountNonLocked以获取正确登录时的用户详细信息

  •  0
  • Michel  · 技术社区  · 16 年前

    对于登录尝试,我在用户类上实现UserDetails类。因此用户类实现 isAccountNonLocked() 错误登录后(发送 AuthenticationFailureBadCredentialsEvent ,我用一个 Eventlistener )Spring从我的用户类调用了这个函数来检查帐户是否被锁定。我实现如下:

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

    当我填写了正确的凭证时,他从不调用这个函数。因此,如果您填写了正确的凭据,他不会检查用户是否被锁定,因此他总是登录,即使 failedLoginAttempts 高于 MAX_FAILED_LOGIN_ATTEMPTS 或者如果帐户被锁定。

    我甚至实现了 AuthenticationSuccessEvent

    这是Spring2.5.6中的bug吗?还是我忘了什么。。。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Michel    10 年前

    解决了问题。

    我实现了这个功能 isAccountNonLocked 在一个 Hibernate 实体但我的 authenticationDao 是JBDC实现而不是 HibernateDaoImpl . 所以在自定义实现UserDetails之后 休眠模式

    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>