www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]上一篇文章講解了JWT的基本簡介,這一篇文章我就來實(shí)戰(zhàn)一下。介紹一下在分布式單點(diǎn)登錄中的使用方法:首先來看一下Token實(shí)體類,public?class?Token?implements?Serial


上一篇文章講解了JWT的基本簡介,這一篇文章我就來實(shí)戰(zhàn)一下。介紹一下在分布式單點(diǎn)登錄中的使用方法:


首先來看一下Token實(shí)體類,


public?class?Token?implements?Serializable{
	private?static?final?long?serialVersionUID?=?-5391652691006115018L;
	
	/**?認(rèn)證頭?**/
	private?Head?head;
	/**?認(rèn)證信息有效載荷?**/
	private?Playload?playload;
	
	/**?第一部分:base64head頭?**/
	private?String?base64Head;
	/**?第二部分:base64playload荷載?**/
	private?String?base64PlayLoad;
	/**?第三部分:簽證信息?**/
	private?String?signature;
	/**?最終token字符串?**/
	private?String?tokenStr;
	
	/**
	?*?Token頭
	?*
	?*
	?*/
	public?static?class?Head?implements?Serializable{
		private?static?final?long?serialVersionUID?=?-6516084948347601103L;
		
		/**?token類型?**/
		private?String?typ?=?"JWT";
		/**?token算法?默認(rèn):HMAC?SHA256**/
		private?String?alg?=?"HS256";
		
		public?String?getTyp()?{
			return?typ;
		}
		public?void?setTyp(String?typ)?{
			this.typ?=?typ;
		}
		public?String?getAlg()?{
			return?alg;
		}
		public?void?setAlg(String?alg)?{
			this.alg?=?alg;
		}
	}
	
	/**
	?*?Token有效載荷
	?*?
	?*
	?*/
	public?static?class?Playload?implements?Serializable?{
		private?static?final?long?serialVersionUID?=?3981890375700111920L;
		
		/**?該token簽發(fā)者?**/
		private?String?iss;
		/**?該token的所有人,可以存放用戶名?**/
		private?String?sub;
		/**?接收token的一方?**/
		private?String?aud;
		/**?token的過期時(shí)間(時(shí)間戳),必須要大于簽發(fā)時(shí)間;大于等于該時(shí)間需要刷新token?**/
		private?long?exp;
		/**?token生效的開始時(shí)間(時(shí)間戳),意味著在這個(gè)時(shí)間之前驗(yàn)證token是會失敗的,默認(rèn)生成token后立即生效?**/
		private?long?nbf;
		/**?token的簽發(fā)時(shí)間?時(shí)間戳**/
		private?long?iat;
		/**?token的唯一身份標(biāo)識,主要用來作為一次性token,從而回避重放攻擊?**/
		private?String?jti;
		/**?token驗(yàn)證寬限時(shí)間(時(shí)間戳)?超過寬限時(shí)間需要重新登錄,??
		?*?即該token的真正存活時(shí)間,寬限時(shí)間的加入是為了解決并發(fā)token刷新后新token失效問題
		?*?**/
		private?long?gra;
		/**?token類型:??后臺登錄用戶,互聯(lián)網(wǎng)用戶,第三方機(jī)構(gòu)?**/
		private?String?typ;
		
		public?String?getIss()?{
			return?iss;
		}
		public?void?setIss(String?iss)?{
			this.iss?=?iss;
		}
		public?String?getSub()?{
			return?sub;
		}
		public?void?setSub(String?sub)?{
			this.sub?=?sub;
		}
		public?String?getAud()?{
			return?aud;
		}
		public?void?setAud(String?aud)?{
			this.aud?=?aud;
		}
		public?long?getExp()?{
			return?exp;
		}
		public?void?setExp(long?exp)?{
			this.exp?=?exp;
		}
		public?long?getNbf()?{
			return?nbf;
		}
		public?void?setNbf(long?nbf)?{
			this.nbf?=?nbf;
		}
		public?long?getIat()?{
			return?iat;
		}
		public?void?setIat(long?iat)?{
			this.iat?=?iat;
		}
		public?String?getJti()?{
			return?jti;
		}
		public?void?setJti(String?jti)?{
			this.jti?=?jti;
		}
		public?long?getGra()?{
			return?gra;
		}
		public?void?setGra(long?gra)?{
			this.gra?=?gra;
		}
		public?String?getTyp()?{
			return?typ;
		}
		public?void?setTyp(String?typ)?{
			this.typ?=?typ;
		}

		
	}

	public?Head?getHead()?{
		return?head;
	}
	public?void?setHead(Head?head)?{
		this.head?=?head;
	}
	public?Playload?getPlayload()?{
		return?playload;
	}
	public?void?setPlayload(Playload?playload)?{
		this.playload?=?playload;
	}
	public?String?getSignature()?{
		return?signature;
	}
	public?void?setSignature(String?signature)?{
		this.signature?=?signature;
	}
	public?String?getBase64Head()?{
		return?base64Head;
	}
	public?void?setBase64Head(String?base64Head)?{
		this.base64Head?=?base64Head;
	}
	public?String?getBase64PlayLoad()?{
		return?base64PlayLoad;
	}
	public?void?setBase64PlayLoad(String?base64PlayLoad)?{
		this.base64PlayLoad?=?base64PlayLoad;
	}
	public?String?getTokenStr()?{
		return?tokenStr;
	}
	public?void?setTokenStr(String?tokenStr)?{
		this.tokenStr?=?tokenStr;
	}
	
}



可以看到實(shí)體類里面包含了head payload signature這三部分。

然后用戶登錄成功之后創(chuàng)建token的代碼如下:


public?static?Token?createToken(String?secret,String?tokenId,TokenType?tokenType,String?userName)?{
		try?{
			Token?token?=?new?Token();
			//創(chuàng)建頭
			Token.Head?head?=?new?Token.Head();
			head.setAlg("HS256");
			head.setTyp("JWT");
			
			//創(chuàng)建載荷
			//簽發(fā)時(shí)間
			long?iat?=?System.currentTimeMillis();
			//過期時(shí)間?20?分鐘后過期
			long?exp?=?iat?+?AuthConstants.TOKEN_EXP_TIME?;
			//最后存活時(shí)間
			long?gra?=?iat?+?AuthConstants.TOKEN_GRA_TIME?;
			Token.Playload?playload?=?new?Token.Playload();
			playload.setAud("CLIENT");?//接收token的一方
			playload.setIat(iat);?//簽發(fā)時(shí)間
			playload.setExp(exp);
			playload.setGra(gra);
			playload.setIss("AUTH_CENTER");//簽發(fā)者
			playload.setJti(tokenId);?//token唯一身份標(biāo)識
			playload.setNbf(iat);//生效時(shí)間,立即生效
			playload.setSub(userName);?//token的所屬者,可以存放用戶名
			playload.setTyp(tokenType.toString().toUpperCase());
			
			//創(chuàng)建token
			String?base64Head?=?Base64Util.encodeStr(JSONUtil.toJson(head)?);
			String?base64Playload?=?Base64Util.encodeStr(JSONUtil.toJson(playload)?);
			String?signature?=?HmacUtil.encryptHMACSHA256(base64Head+"."+base64Playload,?secret);?//token簽名
			String?tokenStr?=?base64Head+"."+base64Playload+"."+signature;?//token字符串
			
			//組裝token對象
			token.setHead(head);
			token.setPlayload(playload);
			token.setBase64Head(base64Head);
			token.setBase64PlayLoad(base64Playload);
			token.setSignature(signature);
			token.setTokenStr(tokenStr);
			return?token;
		}?catch?(Exception?e)?{
			e.printStackTrace();
			logger.error("生成token失敗:{}",e.getMessage());
		}
		return?null;
	}



創(chuàng)建成功之后,要把token放到響應(yīng)頭中,setHeader方法name參數(shù)要用Authorization,value值要使用

"Bearer "+token。

然后用戶訪問需要權(quán)限的接口都需要在請求頭加上token,因?yàn)槭褂昧薙pring Cloud微服務(wù)架構(gòu),因此請求

會統(tǒng)一通過API網(wǎng)關(guān)訪問,所以需要在網(wǎng)關(guān)處驗(yàn)證token的合法性,使用下面這個(gè)parseToken的方法:


/**
	?*?驗(yàn)證并解析token
	?*?@param?token?token字符串
	?*?@param?secret?token簽名的鹽(密鑰)
	?*?@return?成功返回token?,失敗返回ull
	?*/
	public?static?Token?parseToken(String?token,String?secret)?{
		try?{
			//判斷token是否是合法格式的token串
			if(StringUtils.isEmpty(token))?{
				throw?new?AuthException("token串為空!");
			}
			if(StringUtils.isEmpty(secret))?{
				throw?new?AuthException("解析token時(shí),token密鑰為空!");
			}
			String[]?tokens?=?token.split("\.");
			if(tokens==null?||?tokens.length!=3)?{
				throw?new?AuthException("非法格式的token串:"+token);
			}
			
			//token分解
			String?base64Head?=?tokens[0].trim();?//token頭
			String?base64Playload?=?tokens[1].trim();?//token載荷
			String?signature?=?tokens[2].trim();?//token簽名
			//驗(yàn)證簽名是否為合法的
			String?signData?=?base64Head+"."+base64Playload;
			String?signaturedStr?=?HmacUtil.encryptHMACSHA256(signData,?secret.trim());?//token簽名
			if(!signature.equals(signaturedStr))?{
				throw?new?AuthException("非法的token:解析token時(shí),token驗(yàn)簽失敗!");
			}
			
			Token.Head?head?=?JSONUtil.toBean(Base64Util.decodeStr(base64Head),?Token.Head.class);
			Token.Playload?playLoad?=?JSONUtil.toBean(Base64Util.decodeStr(base64Playload),?Token.Playload.class);
			Token?rs?=?new?Token();
			rs.setHead(head);
			rs.setPlayload(playLoad);
			rs.setSignature(signature);
			return?rs;
		}?catch?(Exception?e)?{
			e.printStackTrace();
			logger.error("解析token失敗:{}",e.getMessage());
			return?null;
		}
	}



使用JWT進(jìn)行身份驗(yàn)證的基本方法的實(shí)例就到這里,沒有接觸過JWT的同學(xué)可以先看一下JWT


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉