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;
}
}
当我重新运行代码,在页面输入网址后,出现以下提示:

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()
- 作用:检查用户账户是否未被锁定。
- 返回:
boolean,true表示账户未锁定,false表示账户被锁定。- 使用场景:如果账户被锁定(返回
false),用户无法登录,通常用于临时禁用账户(如多次登录失败后锁定账户)。3.
isCredentialsNonExpired()
- 作用:检查用户的凭据(密码)是否未过期。
- 返回:
boolean,true表示密码未过期,false表示密码已过期。- 使用场景:如果密码过期(返回
false),用户可能需要强制修改密码才能登录。4.
isEnabled()
- 作用:检查用户账户是否启用。
- 返回:
boolean,true表示账户启用,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;
}
}

02 问题发生的原因
- 重写的UserDetails类默认方法返回值为false
1.isAccountNonExpired()
- 判断帐户是否过期
2.isAccountNonLocked()
- 判断帐户是否锁定
3.isCredentialsNonExpired()
- 凭据是否过期,就是登录时间到没到
4.isEnabled()
- 是否启动
03 解决方式
- 将UserDetails接口的实现类里上述方法,也就是所有方法设置为true就可以避免被锁定了
到此这篇关于SpringSecurity显示用户账号已被锁定的原因及解决方案的文章就介绍到这了,更多相关SpringSecurity用户已被锁定内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论