本文主要是介绍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; } }
当我重新运行代码,在页面输入网址后,出现以下提示:
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.chinasem.cnialsNonExpired() { return false; } @Override public boolean isEnabled() { return false; } }
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显示用户账号已被锁定的原因及解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!