91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫動態認證封裝用戶的代碼怎么寫

發布時間:2023-02-15 09:37:34 來源:億速云 閱讀:135 作者:iii 欄目:數據庫

本篇內容介紹了“數據庫動態認證封裝用戶的代碼怎么寫”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

代碼實現

/**
 * 創建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;

“數據庫動態認證封裝用戶的代碼怎么寫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锡林郭勒盟| 金沙县| 莱阳市| 铜陵市| 上高县| 苏尼特右旗| 铜川市| 嵊泗县| 湛江市| 德惠市| 伽师县| 丽水市| 福州市| 宜章县| 三台县| 静安区| 蓝山县| 洞头县| 广丰县| 鹤壁市| 清丰县| 兰西县| 海门市| 乌兰浩特市| 偃师市| 东乌珠穆沁旗| 江安县| 光山县| 吉安县| 洞头县| 本溪| 紫阳县| 隆回县| 台北市| 随州市| 双江| 全州县| 娱乐| 柘荣县| 江川县| 承德县|