我正在使用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中的错误吗?还是我忘记了......
答案 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>