Spring Cloud微服務項目搭建系列文章(九):Spring Cloud gateway集成Spring Cloud Security、Oauth2獲取當前登錄用戶

上一篇Spring Cloud Gateway的集成我們講解了如何集成Spring cloud gateway

本文源碼地址:

源碼地址

那麼接下來我們希望網關做爲入口能集成權限相關認證,具體的集成流程請參考:

Spring Cloud Gateway實現權限控制

集成權限模塊之後,一般的項目獲取當前登錄用戶的接口是調用比較頻繁的接口信息之一。這裏也體現使用JWT的方式的好處之一,部分用戶信息,已經緩存在token之中了。

基於上面的信息,我們可以從Security的上下文出發:

    /**
     * 獲取用戶token信息
     * @return
     */
    default Mono<JSONObject> getTokenInfo(){
        Mono<JSONObject> baseUser = ReactiveSecurityContextHolder.getContext()
                .switchIfEmpty(Mono.error(new IllegalStateException("ReactiveSecurityContext is empty")))
                .map(SecurityContext::getAuthentication)
                .map(Authentication::getPrincipal)
                .map(jwt->{
                    Jwt jwtValue = null;
                    if(jwt instanceof Jwt){
                        jwtValue = (Jwt)jwt;
                    }
                    JSONObject tokenInfo = JSONObject.parseObject(JSONObject.toJSONString(jwtValue.getClaims()));
                    return tokenInfo;
                });
        return baseUser;
    }

這樣獲取到的是整個JWT解碼之後的token信息。然後我們就可以通過token獲取到我們想要的用戶信息了。

    /**
     * 獲取用戶信息
     * @return
     */
    default Mono<BaseUser> getUserInfo(){
        return getTokenInfo().map(token->token.getJSONObject(Constant.USER_INFO).toJavaObject(BaseUser.class));
    }

當然通常情況下爲了權限控制,我們在獲取用戶的同時需要得到整個用戶的權限信息,所以最終的接口成型爲:

    @Override
    public Mono<UserResponse> getUserInfoByAccess() {
        Mono<JSONObject> tokenInfo = getTokenInfo();
        return tokenInfo.map(token->{
            UserResponse userResponse  = new UserResponse();
            BaseUser baseUser = token.getJSONObject(Constant.USER_INFO).toJavaObject(BaseUser.class);
            userResponse.setBaseUser(baseUser);
            JSONArray array = token.getJSONArray("authorities");
            //查詢全部的權限
            List<Permission> result = permissionUtil.getResultPermission(array);
            if(!CollectionUtils.isEmpty(result)) {
                userResponse.setAccess(result.stream().map(Permission::getAuthCode).collect(Collectors.toList()));
            }
            return userResponse;
        });
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章