Безопасность Spring - Spring не проверяет isAccountNonLocked для UserDetails при правильном входе - PullRequest
0 голосов
/ 21 июля 2010

Я использую Spring 2.5.6 и Spring security 2.0.

Для попыток входа в систему я реализую класс UserDetails в своем классе User. Таким образом, класс 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, и если вы введете правильные учетные данные, он обрабатывает этот зарегистрированный обработчик событий (что-то делает, чтобы вернуть failLoginAttempts обратно в 0 после хорошего входа в систему)

Это баг в Spring 2.5.6? или это то, что я забыл ...

1 Ответ

0 голосов
/ 23 июля 2010

Решил проблему.

Я реализовал функцию 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...