首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring安全性- Spring不会在正确登录时检查UserDetails的isAccountNonLocked

Spring安全性- Spring不会在正确登录时检查UserDetails的isAccountNonLocked
EN

Stack Overflow用户
提问于 2010-07-21 21:37:41
回答 1查看 2.1K关注 0票数 1

我使用的是Spring 2.5.6和Spring security 2.0。

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

代码语言:javascript
运行
复制
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吗?还是因为我忘了..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-23 20:01:22

解决了这个问题。

我在一个Hibernate实体中实现了函数isAccountNonLocked,但我的authenticationDao是一个JBDC实现,而不是HibernateDaoImpl。因此,在将UserDetails自定义实现为HibernateDaoImpl之后,最初的问题就解决了。

代码语言:javascript
运行
复制
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中:

代码语言:javascript
运行
复制
<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>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3299800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档