亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

發布時間: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

永嘉县| 上栗县| 台湾省| 海城市| 通州区| 宜兰县| 娄底市| 塔河县| 夹江县| 建德市| 巴楚县| 泸州市| 红原县| 马鞍山市| 宿州市| 梅河口市| 博白县| 台东市| 舒城县| 中方县| 卢龙县| 普兰县| 扎赉特旗| 克山县| 姚安县| 会宁县| 上虞市| 剑河县| 龙口市| 临泉县| 武隆县| 屯门区| 孟津县| 方正县| 东乌| 乌审旗| 罗定市| 太仆寺旗| 日喀则市| 梓潼县| 定南县|