我使用的是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)
这是Spring2.5.6中的一个bug吗?还是因为我忘了..。
发布于 2010-07-23 20:01:22
解决了这个问题。
我在一个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>
https://stackoverflow.com/questions/3299800
复制相似问题