2010-07-21 2 views
0

스프링 2.5.6 및 스프링 보안 2.0을 사용하고 있습니다.스프링 보안 - 올바른 로그인시 UserDetails에 대해 isAccountNonLocked가 확인되지 않습니다.

로그인 시도의 경우 User 클래스에 UserDetails 클래스를 구현합니다. 따라서 User 클래스는 잘못된 로그인 후에 isAccountNonLocked()을 구현합니다. 을 전달하면 Eventlistener으로 처리합니다. Spring은이 함수를 내 User 클래스에서 호출하여 계정이 잠겨 있는지 확인합니다. 나는 이것을 다음과 같이 구현합니다 :

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

잘못된 자격 증명을 사용하면 좋지만 정확한 자격 증명을 입력하면이 기능을 호출하지 않습니다. 따라서 사용자가 올바른 자격 증명을 입력하면 사용자가 잠겨 있는지 확인하지 않으므로 failedLoginAttemptsMAX_FAILED_LOGIN_ATTEMPTS보다 높거나 계정이 잠겨 있어도 항상 로그인합니다.

나는 심지어 AuthenticationSuccessEvent을 구현하고 올바른 자격 증명을 작성하면 그는 봄 2.5.6에

이 버그가 (좋은 로그인 후 다시 0으로 failedLoginAttempts를 설정하는 몇 가지 물건을)이 등록을 한 용의 EventListener를 처리하다 ? 아니면 내가 잊어 버린 것이지 ...

답변

0

문제가 해결되었습니다.

Hibernate 엔티티에 isAccountNonLocked 함수를 구현했지만 authenticationDaoHibernateDaoImpl 대신 JBDC 구현이었습니다. 따라서 UserDetails의 사용자 정의 구현 후 HibernateDaoImpl으로 초기 문제가 해결되었습니다.

<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> 

:
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의

관련 문제