SpringSecurity显示用户账号已被锁定的原因及解决方案

 更新时间:2025年06月19日 11:04:16   作者:大智若愚Null  
SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNonLocked()等方法的逻辑,确保返回正确状态,避免误判账户锁定,从而允许合法用户登录,下面给大家介绍SpringSecurity显示用户账号已被锁定的解决方案,感兴趣的朋友一起看看吧

SpringSecurity显示用户账号已被锁定的解决方案

1.问题出现前的工作

  • 在登录页面显示用户账号已被锁定之前,所做的工作有以下两个:

首先创建了LoginUser类实现UserDetail接口,UserDetail封装了用户的认证信息

/*UserDetails 封装了用户信息*/
@Data
public class LoginUser implements UserDetails {
    /*将用户的账号密码封装成user对象,与数据库对应起来*/
    private User user;
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }
    @Override
    public String getPassword() {
        return user.getPassword();
    }
    @Override
    public String getUsername() {
        return user.getUsername();
    }
    @Override
    public boolean isAccountNonExpired() {
        return false;
    }
    @Override
    public boolean isAccountNonLocked() {
        return false;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }
    @Override
    public boolean isEnabled() {
        return false;
    }
}

接着,创建MyUserDetailsService实现UserDetailsService接口,重写方法,进行认证

@Component
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        根据用户名称获取用户对象
        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
        qw.eq(User::getUsername,username);
        User user = userMapper.selectOne(qw);
//        查不到  提示用户名或密码不存在
        if (StringUtils.isEmpty(user)){
            throw new RuntimeException("用户名或密码不存在");
        }
//       查到用户   获取用户权限 进行封装
//        把用户对象封装到security中
        LoginUser loginUser = new LoginUser();
        loginUser.setUser(user);
        return loginUser;
    }
}

当我重新运行代码,在页面输入网址后,出现以下提示:

2.问题出现原因

出现原因:

重写的UserDetails接口中的方法,有些默认是false,如下:

   @Override
    public boolean isAccountNonExpired() {
        return false;
    }
    @Override
    public boolean isAccountNonLocked() {
        return false;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }
    @Override
    public boolean isEnabled() {
        return false;
    }

各方法含义如下:

1. isAccountNonExpired()

  • 作用:检查用户账户是否未过期。
  • 返回boolean 类型,true 表示账户未过期,false 表示账户已过期。
  • 使用场景:如果账户已过期(返回 false),Spring Security 会拒绝该用户的登录请求。

2. isAccountNonLocked()

  • 作用:检查用户账户是否未被锁定。
  • 返回booleantrue 表示账户未锁定,false 表示账户被锁定。
  • 使用场景:如果账户被锁定(返回 false),用户无法登录,通常用于临时禁用账户(如多次登录失败后锁定账户)。

3. isCredentialsNonExpired()

  • 作用:检查用户的凭据(密码)是否未过期。
  • 返回booleantrue 表示密码未过期,false 表示密码已过期。
  • 使用场景:如果密码过期(返回 false),用户可能需要强制修改密码才能登录。

4. isEnabled()

  • 作用:检查用户账户是否启用。
  • 返回booleantrue 表示账户启用,false 表示账户禁用。
  • 使用场景:如果账户被禁用(返回 false),用户无法登录,通常用于永久禁用账户(如管理员手动禁用)。

3.解决方案

将UserDetails实现类方法中的false都改为true,内容如下:

@Data
public class LoginUser implements UserDetails {
    /*将用户的账号密码封装成user对象,与数据库对应起来*/
    private User user;
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }
    @Override
    public String getPassword() {
        return user.getPassword();
    }
    @Override
    public String

补充:SpringSecurity 用户帐号已被锁定

SpringSecurity 用户帐号已被锁定

01 异常发生场景

  • 当我自定义登录接口时
  • 以下是我的UserDetailsService和UserDetails接口的实现类
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private MsUserServiceImp msUserServiceImp;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //使用mybatis-plus,获取到账号密码数据
        LambdaQueryWrapper<MsUser> qw=new LambdaQueryWrapper<>();
        qw.eq(MsUser::getUsername,username);
        MsUser user = msUserServiceImp.getOne(qw);

        LoginUser loginUser = new LoginUser();
        loginUser.setMsUser(user);

        return loginUser;
    }
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginUser implements UserDetails {
    private MsUser msUser;
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }
    @Override
    public String getPassword() {
        return msUser.getPassword();
    }
    @Override
    public String getUsername() {
        return msUser.getUsername();
    }
    @Override
    public boolean isAccountNonExpired() {
        return false;
    }
    @Override
    public boolean isAccountNonLocked() {
        return false;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }
    @Override
    public boolean isEnabled() {
        return false;
    }
}

02 问题发生的原因

  • 重写的UserDetails类默认方法返回值为false

1.isAccountNonExpired()

  • 判断帐户是否过期

2.isAccountNonLocked()

  • 判断帐户是否锁定

3.isCredentialsNonExpired()

  • 凭据是否过期,就是登录时间到没到

4.isEnabled()

  • 是否启动

03 解决方式

  • 将UserDetails接口的实现类里上述方法,也就是所有方法设置为true就可以避免被锁定了

到此这篇关于SpringSecurity显示用户账号已被锁定的原因及解决方案的文章就介绍到这了,更多相关SpringSecurity用户已被锁定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 你还在用Synchronized?Atomic你了解不?

    你还在用Synchronized?Atomic你了解不?

    这篇文章主要介绍了你还在用Synchronized?Atomic你了解不? 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Java 超详细讲解设计模式之原型模式讲解

    Java 超详细讲解设计模式之原型模式讲解

    原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,今天通过本文给大家介绍下Java 原型设计模式,感兴趣的朋友一起看看吧
    2022-03-03
  • springboot整合过滤器实战步骤

    springboot整合过滤器实战步骤

    在项目开发过程中,过滤器或者拦截器几乎是必用的,他可以很方便的完成类似日志处理、token验证等一系列操作,区别于业务接口,独立进行处理,感觉就是一种Aop思想。下面模拟请求接口前的token验证,进行过滤器的实战
    2022-04-04
  • Java RandomAccessFile 指定位置实现文件读取与写入

    Java RandomAccessFile 指定位置实现文件读取与写入

    这篇文章主要介绍了Java RandomAccessFile 指定位置实现文件读取与写入的相关资料,需要的朋友可以参考下
    2017-01-01
  • JavaWeb之Filter过滤器详解

    JavaWeb之Filter过滤器详解

    本篇文章主要介绍了JavaWeb之Filter过滤器详解,实例分析了JavaWeb之Filter过滤器的使用技巧,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • Java 深入探究讲解抽象工厂模式

    Java 深入探究讲解抽象工厂模式

    当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态
    2022-04-04
  • Java仿文库的基本方法(openoffice+swftools+flexPaper)

    Java仿文库的基本方法(openoffice+swftools+flexPaper)

    这篇文章主要为大家详细介绍了Java仿文库的基本方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • 全网最全SpringBoot集成swagger的详细教程

    全网最全SpringBoot集成swagger的详细教程

    swagger是当下比较流行的实时接口文文档生成工具,swagger分为swagger2 和swagger3两个常用版本,二者区别不是很大,主要对于依赖和注解进行了优化,swagger2需要引入2个jar包,swagger3只需要一个,用起来没有什么大的区别,本文给大家详细介绍,感兴趣的朋友一起看看吧
    2022-08-08
  • 关于JSCH使用自定义连接池的说明

    关于JSCH使用自定义连接池的说明

    这篇文章主要介绍了关于JSCH使用自定义连接池的说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 解决spring cloud gateway 获取body内容并修改的问题

    解决spring cloud gateway 获取body内容并修改的问题

    这篇文章主要介绍了解决spring cloud gateway 获取body内容并修改的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论