gateway 獲取請求源地址及設(shè)置header


package com.weheretech.gatewayserver.config;

import com.weheretech.common.core.constants.DataSourceConstants;

import com.weheretech.common.core.constants.SaasConstants;

import com.weheretech.common.core.dto.user.LoginCacheDTO;

import com.weheretech.common.core.exception.ErrorCode;

import com.weheretech.common.core.exception.SaasException;

import com.weheretech.common.core.utils.TenantUtils;

import com.weheretech.middleware.utils.RedisUtils;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;

import org.springframework.cloud.gateway.filter.GlobalFilter;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.annotation.Order;

import org.springframework.http.HttpHeaders;

import org.springframework.http.server.reactive.ServerHttpRequest;

import org.springframework.util.CollectionUtils;

import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

import java.lang.annotation.Annotation;

import java.net.URI;

import java.util.LinkedHashSet;

import java.util.List;

import java.util.Objects;

/**

* 權(quán)限過濾器

*/

@Slf4j

@Configuration

public class AuthFilterimplements GlobalFilter, Order {

private final StringCOOKIE ="cookie";

? ? private final StringTOKEN ="token=";

? ? @Autowired

? ? private RedisUtilsredisUtils;

? ? /**

* 過濾器順序

*/

? ? @Override

? ? public int value() {

return 1;

? ? }

/**

* 過濾器主邏輯

*

? ? * @param exchange

? ? * @param chain

? ? * @return

? ? */

? ? @Override

? ? public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) {

ServerHttpRequest request = exchange.getRequest();

? ? ? ??//請求源地址host

? ??????String host = request.getRemoteAddress().getAddress().getHostAddress();

? ? ? ? log.info("host========? {}", host);

?? ?????//設(shè)置header頭屬性囚衔,注意下方返回處需要返回return chain.filter(exchange.mutate().request(request).build());

? ? ? ? request = request.mutate().header("domain", host).build();

? ? ? ? // 獲取訪問路徑

? ? ? ? String url = ((LinkedHashSet) Objects.requireNonNull(exchange.getAttribute("org.springframework.cloud.gateway.support.ServerWebExchangeUtils.gatewayOriginalRequestUrl")))

.iterator()

.next()

.getPath();

? ? ? ? // 查詢是否在忽略列表中

? ? ? ? if (SaasConstants.WhiteUri.FILTER_URIS.contains(url)) {

return chain.filter(exchange.mutate().request(request).build());

? ? ? ? }

// 檢查用戶header中攜帶的token

? ? ? ? HttpHeaders headers = request.getHeaders();

? ? ? ? List headerValue = headers.get(COOKIE);

? ? ? ? if (CollectionUtils.isEmpty(headerValue)) {

throw new SaasException(ErrorCode.NO_COOKIE);

? ? ? ? }

// 這里拿的cookie是用";"分割的

? ? ? ? String cookieStr = headerValue.get(0);

? ? ? ? String[] cookies = cookieStr.split(";");

? ? ? ? String authorization =null;

? ? ? ? for (String cookie : cookies) {

cookie = cookie.trim();

? ? ? ? ? ? if (cookie.startsWith(TOKEN)) {

authorization = cookie.substring(6);

break;

? ? ? ? ? ? }

}

if (authorization ==null) {

throw new SaasException(ErrorCode.TOKEN_NOT_FOUND);

? ? ? ? }

// 權(quán)限校驗暫時未做

? ? ? ? if(!DataSourceConstants.Name.PLATFORM_DATA_SOURCE.equals(TenantUtils.getDomain())){

LoginCacheDTO loginCacheDTO = (LoginCacheDTO)redisUtils.get(authorization);

? ? ? ? ? ? //判斷權(quán)限

//? ? ? ? ? ? AuthUtils.setCurrentUser(loginCacheDTO);

//? ? ? ? ? ? if(!loginCacheDTO.getUrls().contains(url)){

//? ? ? ? ? ? ? ? throw new SaasException(ErrorCode.UNAUHORIZATION);

//? ? ? ? ? ? }

? ? ? ? }

//? ? ? ? ResponseVo responseVo = authClient.checkApi(new Authorization(authorization, url));

//? ? ? ? if (responseVo.getStatus() != ResponseEnum.SUCCESS.getCode()) {

//? ? ? ? ? ? throw new ResponseException(responseVo);

//? ? ? ? }

// 校驗通過靠益,放行

? ? ? ? return chain.filter(exchange.mutate().request(request).build());

? ? }

@Override

? ? public ClassannotationType() {

return null;

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袱耽,更是在濱河造成了極大的恐慌鉴未,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饿这,居然都是意外死亡,警方通過查閱死者的電腦和手機撞秋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門长捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吻贿,“玉大人串结,你說我怎么就攤上這事舅列。” “怎么了帐要?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵把敞,是天一觀的道長。 經(jīng)常有香客問我榨惠,道長盛霎,這世上最難降的妖魔是什么耽装? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任愤炸,我火速辦了婚禮,結(jié)果婚禮上掉奄,老公的妹妹穿的比我還像新娘规个。我一直安慰自己,他們只是感情好绰姻,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布引瀑。 她就那樣靜靜地躺著,像睡著了一般憨栽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屑柔,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音死陆,去河邊找鬼狱意。 笑死,一個胖子當著我的面吹牛偎行,可吹牛的內(nèi)容都是我干的领虹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼塌衰,長吁一口氣:“原來是場噩夢啊……” “哼蝠嘉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚤告,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤罩缴,失蹤者是張志新(化名)和其女友劉穎层扶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜会,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡终抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匾旭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圃郊。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖持舆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情居兆,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布泥栖,位于F島的核電站勋篓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏生巡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望须揣。 院中可真熱鬧,春花似錦疯汁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溢豆。三九已至,卻和暖如春搓茬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卷仑。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工麸折, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垢啼。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓膊夹,卻偏偏與公主長得像衬浑,于是被迫代替她去往敵國和親放刨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容