当前位置: 代码网 > it编程>编程语言>Java > SpringSecurity显示用户账号已被锁定的原因及解决方案

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

2025年06月19日 Java 我要评论
springsecurity显示用户账号已被锁定的解决方案1.问题出现前的工作在登录页面显示用户账号已被锁定之前,所做的工作有以下两个:首先创建了loginuser类实现userdetail接口,us

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用户已被锁定内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com