java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringSecurity用户已被锁定

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

作者:大智若愚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 异常发生场景

@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 问题发生的原因

1.isAccountNonExpired()

2.isAccountNonLocked()

3.isCredentialsNonExpired()

4.isEnabled()

03 解决方式

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

您可能感兴趣的文章:
阅读全文