SpringSecurity顯示用戶賬號(hào)已被鎖定的原因及解決方案
SpringSecurity顯示用戶賬號(hào)已被鎖定的解決方案
1.問(wèn)題出現(xiàn)前的工作
- 在登錄頁(yè)面顯示用戶賬號(hào)已被鎖定之前,所做的工作有以下兩個(gè):
首先創(chuàng)建了LoginUser類實(shí)現(xiàn)UserDetail接口,UserDetail封裝了用戶的認(rèn)證信息
/*UserDetails 封裝了用戶信息*/
@Data
public class LoginUser implements UserDetails {
/*將用戶的賬號(hào)密碼封裝成user對(duì)象,與數(shù)據(jù)庫(kù)對(duì)應(yīng)起來(lái)*/
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;
}
}接著,創(chuàng)建MyUserDetailsService實(shí)現(xiàn)UserDetailsService接口,重寫方法,進(jìn)行認(rèn)證
@Component
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 根據(jù)用戶名稱獲取用戶對(duì)象
LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
qw.eq(User::getUsername,username);
User user = userMapper.selectOne(qw);
// 查不到 提示用戶名或密碼不存在
if (StringUtils.isEmpty(user)){
throw new RuntimeException("用戶名或密碼不存在");
}
// 查到用戶 獲取用戶權(quán)限 進(jìn)行封裝
// 把用戶對(duì)象封裝到security中
LoginUser loginUser = new LoginUser();
loginUser.setUser(user);
return loginUser;
}
}當(dāng)我重新運(yùn)行代碼,在頁(yè)面輸入網(wǎng)址后,出現(xiàn)以下提示:

2.問(wèn)題出現(xiàn)原因
出現(xiàn)原因:
重寫的UserDetails接口中的方法,有些默認(rèn)是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()
- 作用:檢查用戶賬戶是否未過(guò)期。
- 返回:
boolean類型,true表示賬戶未過(guò)期,false表示賬戶已過(guò)期。- 使用場(chǎng)景:如果賬戶已過(guò)期(返回
false),Spring Security 會(huì)拒絕該用戶的登錄請(qǐng)求。2.
isAccountNonLocked()
- 作用:檢查用戶賬戶是否未被鎖定。
- 返回:
boolean,true表示賬戶未鎖定,false表示賬戶被鎖定。- 使用場(chǎng)景:如果賬戶被鎖定(返回
false),用戶無(wú)法登錄,通常用于臨時(shí)禁用賬戶(如多次登錄失敗后鎖定賬戶)。3.
isCredentialsNonExpired()
- 作用:檢查用戶的憑據(jù)(密碼)是否未過(guò)期。
- 返回:
boolean,true表示密碼未過(guò)期,false表示密碼已過(guò)期。- 使用場(chǎng)景:如果密碼過(guò)期(返回
false),用戶可能需要強(qiáng)制修改密碼才能登錄。4.
isEnabled()
- 作用:檢查用戶賬戶是否啟用。
- 返回:
boolean,true表示賬戶啟用,false表示賬戶禁用。- 使用場(chǎng)景:如果賬戶被禁用(返回
false),用戶無(wú)法登錄,通常用于永久禁用賬戶(如管理員手動(dòng)禁用)。
3.解決方案
將UserDetails實(shí)現(xiàn)類方法中的false都改為true,內(nèi)容如下:
@Data
public class LoginUser implements UserDetails {
/*將用戶的賬號(hào)密碼封裝成user對(duì)象,與數(shù)據(jù)庫(kù)對(duì)應(yīng)起來(lái)*/
private User user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String補(bǔ)充:SpringSecurity 用戶帳號(hào)已被鎖定
SpringSecurity 用戶帳號(hào)已被鎖定
01 異常發(fā)生場(chǎng)景
- 當(dāng)我自定義登錄接口時(shí)
- 以下是我的UserDetailsService和UserDetails接口的實(shí)現(xiàn)類
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private MsUserServiceImp msUserServiceImp;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//使用mybatis-plus,獲取到賬號(hào)密碼數(shù)據(jù)
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 問(wèn)題發(fā)生的原因
- 重寫的UserDetails類默認(rèn)方法返回值為false
1.isAccountNonExpired()
- 判斷帳戶是否過(guò)期
2.isAccountNonLocked()
- 判斷帳戶是否鎖定
3.isCredentialsNonExpired()
- 憑據(jù)是否過(guò)期,就是登錄時(shí)間到?jīng)]到
4.isEnabled()
- 是否啟動(dòng)
03 解決方式
- 將UserDetails接口的實(shí)現(xiàn)類里上述方法,也就是所有方法設(shè)置為true就可以避免被鎖定了
到此這篇關(guān)于SpringSecurity顯示用戶賬號(hào)已被鎖定的原因及解決方案的文章就介紹到這了,更多相關(guān)SpringSecurity用戶已被鎖定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id
這篇文章主要介紹了如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
java實(shí)現(xiàn)水果超市管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水果超市管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Spring MVC接口防數(shù)據(jù)篡改和重復(fù)提交
這篇文章主要為大家詳細(xì)介紹了Spring MVC接口防數(shù)據(jù)篡改和重復(fù)提交,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
java如何實(shí)現(xiàn)判斷文件的真實(shí)類型
本篇文章主要介紹了java如何實(shí)現(xiàn)判斷文件的真實(shí)類型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
解決MyEclipse中的Building workspace問(wèn)題的三個(gè)方法
這篇文章主要介紹了解決MyEclipse中的Building workspace問(wèn)題的三個(gè)方法,需要的朋友可以參考下2015-11-11

