共計 2423 個字符,預計需要花費 7 分鐘才能閱讀完成。
本篇內容介紹了“數據庫動態認證封裝用戶的代碼怎么寫”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
代碼實現
/**
* 創建 1 個抽象類
* 將代碼重復部分放到抽象類中
* 代碼不同的部分,讓其他類繼承該抽象類重寫
*/
public abstract class AbstractUserDetailsService implements UserDetailsService {
@Autowired
private SysPermissionService sysPermissionService;
/**
* 這個方法交給子類去實現它,查詢用戶信息
* @param usernameOrMobile 用戶名或者手機號
* @return
*/
public abstract SysUser findSysUser(String usernameOrMobile);
@Override
public UserDetails loadUserByUsername(String usernameOrMobile) throws UsernameNotFoundException {
// 1. 通過請求的用戶名去數據庫中查詢用戶信息
SysUser sysUser = findSysUser(usernameOrMobile);
// 通過用戶 id 去獲取權限信息
findSysPermission(sysUser);
return sysUser;
}
// 私有的方法,里面放到時重復的代碼
private void findSysPermission(SysUser sysUser) {
// 判斷該用戶是否存在
if(sysUser == null) {
throw new UsernameNotFoundException( 用戶名或密碼錯誤
}
// 2. 查詢該用戶有哪一些權限
List SysPermission permissions = sysPermissionService.findByUserId(sysUser.getId());
// 判斷該用戶擁有的權限是否為空
if(CollectionUtils.isEmpty(permissions)) {
return ;
}
// 將權限設置到該對象中
sysUser.setPermissions(permissions);
// 3. 封裝權限信息
List GrantedAuthority authorities = Lists.newArrayList();
for(SysPermission sp: permissions) {
// 獲取權限標識
String code = sp.getCode();
authorities.add(new SimpleGrantedAuthority(code));
}
// 不需要 return,因為是同一個對象
sysUser.setAuthorities(authorities);
}
* 實現自定義的抽象類
* 查詢數據庫中的用戶信息
*/
@Component(customUserDetailsService)
//public class CustomUserDetailsService implements UserDetailsService {
public class CustomUserDetailsService extends AbstractUserDetailsService { Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
PasswordEncoder passwordEncoder;
@Autowired
SysUserService sysUserService;
@Override
public SysUser findSysUser(String usernameOrMobile) { logger.info( 請求認證的用戶名: + usernameOrMobile);
// 1. 通過請求的用戶名去數據庫中查詢用戶信息
return sysUserService.findByUsername(usernameOrMobile);
}
@Component(mobileUserDetailsService)
public class MobileUserDetailsService extends AbstractUserDetailsService { Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
SysUserService sysUserService;
@Override
public SysUser findSysUser(String usernameOrMobile) { logger.info( 請求的手機號是: + usernameOrMobile);
// 1. 通過手機號查詢用戶信息
return sysUserService.findByMobile(usernameOrMobile);
}
}
注意點
# 抽象類和子類中必須包含如下代碼,不能刪除,且抽象類和子類中只能有 1 個類包含該代碼
@Autowired
PasswordEncoder passwordEncoder;
“數據庫動態認證封裝用戶的代碼怎么寫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!
正文完