怎么我的云表格打不開(為什么云文檔打不開)
821
2022-05-29
在本號(hào)的一系列Spring Security文章中,先后介紹了各種登錄驗(yàn)證及授權(quán)中的知識(shí)點(diǎn),如:spring-security簡介并與shiro對(duì)比、 formLogin模式登錄認(rèn)證、動(dòng)態(tài)數(shù)據(jù)登錄驗(yàn)證與權(quán)限分配、賬戶多次登錄失敗鎖定、RememberMe記住我功能,等等文章。筆者覺得以上的這些實(shí)際上都很簡單,我們沒有涉及到分布式應(yīng)用。本節(jié)將以分布式的應(yīng)用背景,講解驗(yàn)證碼實(shí)現(xiàn)的多種方式。本小節(jié)先從理論的角度為大家講解,具體實(shí)現(xiàn)筆者還會(huì)再寫。
session存儲(chǔ)驗(yàn)證碼,不適用于分布式應(yīng)用
共享session存儲(chǔ)驗(yàn)證碼,適用于分布式應(yīng)用
基于對(duì)稱算法的驗(yàn)證碼,適用于分布式應(yīng)用
一、驗(yàn)證碼的組成部分
驗(yàn)證碼實(shí)際上和謎語有點(diǎn)像,分為謎面和謎底。謎面通常是圖片,謎底通常為文字。謎面用于展現(xiàn),謎底用于校驗(yàn)。
對(duì)于字符型驗(yàn)證碼。比如:謎面是顯示字符串"ABGH"的圖片,謎底是字符串"ABGH"
對(duì)于計(jì)算類驗(yàn)證碼。比如:謎面是“1 1=”的圖片,謎底是“2”
對(duì)于拖拽類的驗(yàn)證碼。比如:謎面是一個(gè)拖拽式的拼圖,謎底是拼圖位置的坐標(biāo)
總之,不管什么形式的謎面,最后用戶的輸入內(nèi)容要和謎底進(jìn)行驗(yàn)證。
二、session存儲(chǔ)驗(yàn)證碼
圖中藍(lán)色為服務(wù)端、澄粉色為客戶端。
這是一種最典型的驗(yàn)證碼實(shí)現(xiàn)方式,實(shí)現(xiàn)方式也比較簡單。
應(yīng)用服務(wù)端隨機(jī)的生成驗(yàn)證碼文字
將驗(yàn)證碼文字存到session里面
根據(jù)驗(yàn)證碼文字生成驗(yàn)證碼圖片,響應(yīng)給客戶端
檢查用戶輸入的內(nèi)容與驗(yàn)證碼謎底是否一致
這種實(shí)現(xiàn)方式的優(yōu)點(diǎn)就是比較簡單,缺點(diǎn)就是:因?yàn)橐惶讘?yīng)用部署一個(gè)session,當(dāng)我們把應(yīng)用部署多套如:A、B、C,他們各自有一個(gè)session并且不共享。導(dǎo)致的結(jié)果就是驗(yàn)證碼和圖片由A生成,但是驗(yàn)證請(qǐng)求發(fā)送到了B,這樣就不可能驗(yàn)證通過。
三、共享session存儲(chǔ)驗(yàn)證碼
在第二小節(jié)講到的問題,實(shí)際上不是驗(yàn)證碼的問題,而是如何保證session唯一性或共享性的問題。主要的解決方案有兩種:
通常我們實(shí)現(xiàn)負(fù)載均衡應(yīng)用的前端都是使用nginx或者h(yuǎn)aproxy,二者都可以配置負(fù)載均衡策略。其中一種策略就是:你的客戶端ip上一次請(qǐng)求的是A應(yīng)用,你的下一次請(qǐng)求還轉(zhuǎn)發(fā)給A應(yīng)用。這樣就保證了session的唯一性。但是這種方式有可能會(huì)導(dǎo)致A、B、C應(yīng)用其中一個(gè)或兩個(gè)分配了大量的請(qǐng)求,而另外一個(gè)處理很少的請(qǐng)求,導(dǎo)致負(fù)載并不均衡。
另外一種非常通用的方式就是將分布式應(yīng)用的session統(tǒng)一管理,也就是說原來A、B、C各自的session都存在自己的內(nèi)存中,現(xiàn)在更改為統(tǒng)一存儲(chǔ)到一個(gè)地方,大家一起用。這樣就實(shí)現(xiàn)了session的唯一和共享,是實(shí)現(xiàn)分布式應(yīng)用session管理的有效途徑。在Spring框架內(nèi),最成熟的解決方案就是spring session redis ??勺孕袇⒖紝?shí)現(xiàn)。
四、基于對(duì)稱算法的驗(yàn)證碼
可能出于主機(jī)資源的考慮,可能出于系統(tǒng)架構(gòu)的考量,有些應(yīng)用是無狀態(tài)的。
什么是無狀態(tài)應(yīng)用:就是不保存用戶狀態(tài)的應(yīng)用。
什么是用戶狀態(tài):比如當(dāng)你登陸之后,在session中保存的用戶的名稱、組織等等信息。
所以可以簡單的理解,無狀態(tài)應(yīng)用就是無session應(yīng)用。當(dāng)然這并不完全準(zhǔn)確。
那么對(duì)于這些無狀態(tài)的應(yīng)用,我們就無法使用session,或者換個(gè)說法從團(tuán)隊(duì)開發(fā)規(guī)范上就不讓使用session。那么我們的驗(yàn)證碼該怎么做?
同樣,首先要生成隨機(jī)的驗(yàn)證碼(謎底),但是不做任何存儲(chǔ)操作
將謎底(驗(yàn)證碼文字)加上時(shí)間串、應(yīng)用信息等組成一個(gè)字符串進(jìn)行加密。必須是對(duì)稱加密,也就是說可以解密的加密算法。
生成驗(yàn)證碼圖片,并與加密后的密文,通過cookies一并返回給客戶端。
當(dāng)用戶輸入驗(yàn)證碼提交登錄之后,服務(wù)端解密cookies中的密文(主要是驗(yàn)證碼文字),與用戶的輸入進(jìn)行驗(yàn)證比對(duì)。
這種做法的缺陷是顯而易見的:實(shí)際上就是將驗(yàn)證碼文字在客戶端服務(wù)端之間走了一遍。雖然是加密后的驗(yàn)證碼文字,但是有加密就必須有解密,否則無法驗(yàn)證。所以更為穩(wěn)妥的做法是為每一個(gè)用戶生成密鑰,并將密鑰保存到數(shù)據(jù)庫里面,在對(duì)應(yīng)的階段內(nèi)調(diào)用密鑰進(jìn)行加密或者解密。
從密碼學(xué)的角度講,沒有一種對(duì)稱的加密算法是絕對(duì)安全的。所以更重要的是保護(hù)好你的密鑰。正如沒有一把鎖頭是絕對(duì)安全的,更重要的是保護(hù)好你的鑰匙。
期待您的關(guān)注
向您推薦博主的系列文檔:《手摸手教您學(xué)習(xí)SpringBoot系列-16章97節(jié)》
本文轉(zhuǎn)載注明出處(必須帶連接,不能只轉(zhuǎn)文字):字母哥博客。
分布式
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。