开发者

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

目录
  • SpringSecurity显示用户账号已被锁定的解决方案
  • 1.问题出现前的工作
  • 2.问题出现原因
    • 各方法含义如下:
    • 1. isAccountNonExpired()
    • 2. isAccountNonLocked()
    • 3. isCredentialsNonExpired()
    • 4. isEnabled()
  • 3.解决方案
    • SpringSecurity 用户帐号已被锁定
      • 01 异常发生场景
      • 02 问题发生的原因
      • 1.isAccountNonExpired()
      • 2.isAccountNonLocked()
      • 3.isCredentialsNonExpired()
      • 4.isEnabled()
      • 03 解决方式

    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.devze.comialsNonExpired() {
            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用户已被锁定内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜