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

本文主要是介绍SpringSecurity显示用户账号已被锁定的原因及解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon...

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

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

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

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

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 LogipythonnUser implements UserDetails {
    /*将用户的账号密码封装成user对象,与数据库对应起来*/
    private User user;
    @Override
    public Collection<? extendandroids 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 isCredentwww.chinasem.cnialsNonExpired() {
        return false;
    }
    @Override
    public boolean isEnabled() {
        return false;
    }
}

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

02 问题发生的原因

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

1.isAccountNonExpired()

  • 判断帐户是否过期

2.isAccountNonLocked()

  • 判断帐户是否锁定

3.isCredentialsNonExpired()

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

4.isEnabled()

  • 是否启动

03 解决方式

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

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

这篇关于SpringSecurity显示用户账号已被锁定的原因及解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155135

相关文章

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤