您好,登錄后才能下訂單哦!
本篇內容介紹了“數據庫動態認證封裝用戶的代碼怎么寫”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
代碼實現
/** * 創建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;
“數據庫動態認證封裝用戶的代碼怎么寫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。