本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別地涉及一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法。
背景技術(shù):
隨著電子商務(wù)、社交網(wǎng)絡(luò)、微博等一系列新型互聯(lián)網(wǎng)產(chǎn)品的誕生,基于Web環(huán)境的互聯(lián)網(wǎng)應(yīng)用越來(lái)越廣泛。企業(yè)信息化的過(guò)程中各種應(yīng)用都架設(shè)在Web平臺(tái)上,Web業(yè)務(wù)的迅速發(fā)展也引起黑客們的強(qiáng)烈關(guān)注,接踵而至的就是Web安全威脅的凸顯。黑客利用網(wǎng)站操作系統(tǒng)的漏洞和Web服務(wù)程序的SQL注入漏洞等方式,得到Web服務(wù)器的控制權(quán)限,輕則篡改網(wǎng)頁(yè)內(nèi)容,重則竊取重要內(nèi)部數(shù)據(jù),更為嚴(yán)重的則是在網(wǎng)頁(yè)中植入惡意代碼,使得網(wǎng)站訪(fǎng)問(wèn)者受到侵害。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)急需一個(gè)權(quán)威的安全框架,來(lái)進(jìn)行簡(jiǎn)單安全的功能開(kāi)發(fā)。
ApacheShiro是一個(gè)強(qiáng)大易用的Java安全框架,提供了認(rèn)證、授權(quán)、加密和會(huì)話(huà)管理等功能。對(duì)于任何一個(gè)應(yīng)用程序,Shiro都可以提供全面的安全管理服務(wù)。并且相對(duì)于其他安全框架,Shiro要簡(jiǎn)單的多。
Shiro的三個(gè)核心組件分別是Subject、SecurityManager和Realm。Subject是一個(gè)抽象概念,代表了當(dāng)前操作用戶(hù),可以是人,也可以是第三方進(jìn)程、后臺(tái)帳戶(hù)或其他類(lèi)似事物。SecurityManager是一個(gè)安全管理器,管理所有與安全有關(guān)的操作,Shiro通過(guò)SecurityManager來(lái)管理內(nèi)部組件實(shí)例,并通過(guò)它來(lái)提供安全管理的各種服務(wù)。Realm充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說(shuō),當(dāng)對(duì)用戶(hù)執(zhí)行認(rèn)證(登錄)和授權(quán)(訪(fǎng)問(wèn)控制)驗(yàn)證時(shí),Shiro會(huì)從應(yīng)用配置的Realm中查找用戶(hù)及其權(quán)限信息。從這個(gè)意義上講,Realm實(shí)質(zhì) 上是一個(gè)安全相關(guān)的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象:它封裝了數(shù)據(jù)源的連接細(xì)節(jié),并在需要時(shí)將相關(guān)數(shù)據(jù)如用戶(hù)、角色、權(quán)限等提供給Shiro。當(dāng)配置Shiro時(shí),必須至少指定一個(gè)Realm,用于認(rèn)證和(或)授權(quán)。
也就是說(shuō),最簡(jiǎn)單的一個(gè)Shiro應(yīng)用:
1、應(yīng)用代碼通過(guò)Subject來(lái)進(jìn)行認(rèn)證和授權(quán),而Subject又委托給SecurityManager;
2、我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的用戶(hù)及其權(quán)限進(jìn)行判斷。
Shiro內(nèi)置了可以連接大量安全數(shù)據(jù)源(又名目錄)的Realm,如輕量目錄訪(fǎng)問(wèn)協(xié)議(LDAP)目錄、關(guān)系數(shù)據(jù)庫(kù)(JDBC)、類(lèi)似INI的文本配置資源以及屬性文件等。其中,針對(duì)大量、復(fù)雜數(shù)據(jù)的存儲(chǔ),Shiro框架支持兩種Realm存儲(chǔ)方式進(jìn)行安全驗(yàn)證,一種是基于關(guān)系數(shù)據(jù)庫(kù)的存儲(chǔ)方式的安全驗(yàn)證(如圖1所示,為Shiro框架基于關(guān)系數(shù)據(jù)庫(kù)的Realm存儲(chǔ)的安全驗(yàn)證流程圖),另一種是基于EhCache(一個(gè)純Java的進(jìn)程內(nèi)緩存框架)的存儲(chǔ)方式的安全驗(yàn)證。
以圖1為例,對(duì)數(shù)據(jù)庫(kù)中按照Shiro的驗(yàn)證規(guī)則存儲(chǔ)的大量數(shù)據(jù)信息進(jìn)行驗(yàn)證,開(kāi)始(步驟S11)后,用戶(hù)輸入系統(tǒng)登錄所需的信息;之后,根據(jù)用戶(hù)輸入的登錄信息生成用戶(hù)對(duì)象(步驟S12);根據(jù)生成的用戶(hù)對(duì)象從數(shù)據(jù)庫(kù)中獲取對(duì)應(yīng)的Realm對(duì)象(步驟S13);在進(jìn)行Realm對(duì)象獲取時(shí),首先,判斷該Realm對(duì)象是否存在(步驟S14);如果存在,通過(guò)Shiro框架的SecurityManager進(jìn)行驗(yàn)證(步驟S15),以判斷輸入的登錄信息是否正確,否則結(jié)束。同樣地,基于EhCache的存儲(chǔ)方式的安全驗(yàn)證與此類(lèi)似,區(qū)別僅是Realm對(duì)象存儲(chǔ)的位置不同,相應(yīng)的步驟S13中為從EhCache中獲取對(duì)應(yīng)的Realm對(duì)象。
然而,在使用過(guò)程中發(fā)現(xiàn),現(xiàn)有的技術(shù)方案僅能支持對(duì)在關(guān)系型數(shù)據(jù)庫(kù)和EhCache中存儲(chǔ)的數(shù)據(jù)進(jìn)行安全驗(yàn)證,存在著明顯的缺陷和 不足。
1、基于關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)的安全驗(yàn)證:
常用的關(guān)系數(shù)據(jù)庫(kù)如Oracle和MySQL等,都存在存取速度慢、數(shù)據(jù)結(jié)構(gòu)單一、并發(fā)能力低和集群難度大等缺點(diǎn)。基于關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)及讀取,不僅需要在數(shù)據(jù)庫(kù)中增加大量的數(shù)據(jù)庫(kù)表,同時(shí)在存儲(chǔ)及讀取過(guò)程中響應(yīng)速度慢,造成服務(wù)整體性能下降。在高并發(fā)系統(tǒng)中,大量而頻繁的訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),將導(dǎo)致數(shù)據(jù)庫(kù)死鎖,從而造成系統(tǒng)崩潰。
2、基于EhCache存儲(chǔ)的安全驗(yàn)證:
EhCache是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,它是基于JVM(Java Virtual Machine,Java虛擬機(jī))內(nèi)存進(jìn)行數(shù)據(jù)存儲(chǔ)的。JVM內(nèi)存空間很小,需要對(duì)過(guò)大過(guò)多的對(duì)象進(jìn)行緩存時(shí),將會(huì)造成內(nèi)存溢出,導(dǎo)致服務(wù)不可用。
綜上,數(shù)據(jù)庫(kù)已成為大型網(wǎng)站性能瓶頸的重要因素,很多互聯(lián)網(wǎng)公司已經(jīng)大量使用緩存技術(shù),來(lái)減小數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)壓力;EhCache由于內(nèi)存空間大小的限制,很多場(chǎng)景都不可用。因此,亟需一種新的Realm存儲(chǔ)方式,來(lái)解決以上的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明提供一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法,基于Redis緩存技術(shù)進(jìn)行數(shù)據(jù)存儲(chǔ),存儲(chǔ)方式更為靈活,通過(guò)將會(huì)話(huà)放置于Redis中緩存,能夠減少內(nèi)存消耗,以解決內(nèi)存溢出的問(wèn)題;引入過(guò)期時(shí)間算法來(lái)自動(dòng)清除緩存,提高了緩存的效率和命中率,從而保證數(shù)據(jù)高效、可靠的進(jìn)行存儲(chǔ)。
為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法。
本發(fā)明的一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法包括:根據(jù)用戶(hù)的登錄參數(shù),將用戶(hù)的標(biāo)識(shí)信息進(jìn)行封裝,生成唯一標(biāo)識(shí);根據(jù)所述唯一標(biāo)識(shí),查找Redis服務(wù)器中是否有對(duì)應(yīng)的緩存;如果有所述對(duì)應(yīng)的緩存,則獲取所述唯一標(biāo)識(shí)的登錄信息,并封裝登錄成功信息;如果沒(méi)有所述對(duì)應(yīng)的緩存,則調(diào)用登錄驗(yàn)證方法及權(quán)限驗(yàn)證方法進(jìn)行驗(yàn)證,若驗(yàn)證通過(guò),封裝登錄成功信息,若驗(yàn)證失敗,提示登錄驗(yàn)證失敗。
可選地,所述用戶(hù)的標(biāo)識(shí)信息包括:用戶(hù)的用戶(hù)名、域名及根據(jù)預(yù)定規(guī)則生成的特定標(biāo)識(shí)。
可選地,獲取所述唯一標(biāo)識(shí)的登錄信息之后,還包括:更新所述唯一標(biāo)識(shí)的過(guò)期時(shí)間。
可選地,更新所述唯一標(biāo)識(shí)的過(guò)期時(shí)間包括:通過(guò)調(diào)用過(guò)期時(shí)間算法進(jìn)行計(jì)算,得到所述唯一標(biāo)識(shí)的過(guò)期時(shí)間并進(jìn)行更新。
可選地,所述過(guò)期時(shí)間算法包括:判斷兩次登錄驗(yàn)證期間是否有訪(fǎng)問(wèn)次數(shù);如果有訪(fǎng)問(wèn)次數(shù),則判斷所述訪(fǎng)問(wèn)次數(shù)是否超過(guò)最大訪(fǎng)問(wèn)次數(shù);如果所述訪(fǎng)問(wèn)次數(shù)超過(guò)最大訪(fǎng)問(wèn)次數(shù),則取最大過(guò)期時(shí)間作為過(guò)期時(shí)間;否則,獲取過(guò)期時(shí)間增量值,并根據(jù)所述過(guò)期時(shí)間增量值、訪(fǎng)問(wèn)次數(shù)及默認(rèn)過(guò)期時(shí)間計(jì)算過(guò)期時(shí)間;如果沒(méi)有訪(fǎng)問(wèn)次數(shù),則將默認(rèn)過(guò)期時(shí)間作為所述過(guò)期時(shí)間。
可選地,所述登錄驗(yàn)證方法包括:根據(jù)所述唯一標(biāo)識(shí)從Redis中獲取正確的用戶(hù)名并驗(yàn)證用戶(hù)輸入的用戶(hù)名是否合法;如果用戶(hù)輸入的用戶(hù)名合法,則根據(jù)所述唯一標(biāo)識(shí)從Redis中獲取正確的密碼并驗(yàn)證用戶(hù)輸入的密碼是否合法;如果用戶(hù)輸入的密碼合法,提示登錄驗(yàn)證成功;否則,提示登錄驗(yàn)證失?。蝗绻脩?hù)輸入的用戶(hù)名不合法,則提示用戶(hù)輸入的用戶(hù)名錯(cuò)誤。
可選地,所述權(quán)限驗(yàn)證方法包括:根據(jù)所述唯一標(biāo)識(shí)從Redis中獲取對(duì)應(yīng)的角色信息并進(jìn)行角色授權(quán);根據(jù)所述唯一標(biāo)識(shí)從Redis中獲取對(duì)應(yīng)的權(quán)限信息并進(jìn)行權(quán)限授權(quán)。
根據(jù)本發(fā)明的技術(shù)方案,通過(guò)將用戶(hù)名封裝為唯一標(biāo)識(shí),可以方便從Redis服務(wù)器中進(jìn)行數(shù)據(jù)的存取操作;將會(huì)話(huà)放置于Redis中緩存,既減少了內(nèi)存消耗,解決了內(nèi)存溢出的問(wèn)題,同時(shí)在對(duì)登錄信息進(jìn)行驗(yàn)證時(shí),若Redis服務(wù)器的緩存中存在該唯一標(biāo)識(shí),則無(wú)需調(diào)用登錄驗(yàn)證方法及權(quán)限驗(yàn)證方法進(jìn)行驗(yàn)證,可使驗(yàn)證過(guò)程簡(jiǎn)化,從而提高了驗(yàn)證效率;通過(guò)引入過(guò)期時(shí)間算法來(lái)自動(dòng)清除緩存,解決了手動(dòng)清除緩存數(shù)據(jù)帶來(lái)的冗余和數(shù)據(jù)偏差,從而提高了緩存的效率和命中率,保證了數(shù)據(jù)高效、可靠地進(jìn)行存儲(chǔ)。
附圖說(shuō)明
附圖用于更好地理解本發(fā)明,不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。其中:
圖1是現(xiàn)有技術(shù)中Shiro框架基于關(guān)系數(shù)據(jù)庫(kù)的Realm存儲(chǔ)的安全驗(yàn)證流程圖;
圖2是根據(jù)本發(fā)明實(shí)施例的一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法的主要步驟示意圖;
圖3是根據(jù)本發(fā)明實(shí)施方式的Shiro驗(yàn)證流程圖;
圖4是根據(jù)本發(fā)明實(shí)施方式的登錄驗(yàn)證方法的實(shí)現(xiàn)流程圖;
圖5是根據(jù)本發(fā)明實(shí)施方式的權(quán)限驗(yàn)證方法的實(shí)現(xiàn)流程圖;
圖6是根據(jù)本發(fā)明實(shí)施方式的過(guò)期時(shí)間算法的實(shí)現(xiàn)流程圖;
圖7是根據(jù)本發(fā)明實(shí)施方式的獲取緩存方法的實(shí)現(xiàn)流程圖。
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明的示范性實(shí)施例做出說(shuō)明,其中包括本發(fā)明實(shí)施例的各種細(xì)節(jié)以助于理解,應(yīng)當(dāng)將它們認(rèn)為僅僅是示范性的。因此,本領(lǐng)域普通技術(shù)人員應(yīng)當(dāng)認(rèn)識(shí)到,可以對(duì)這里描述的實(shí)施例做 出各種改變和修改,而不會(huì)背離本發(fā)明的范圍和精神。同樣,為了清楚和簡(jiǎn)明,以下的描述中省略了對(duì)公知功能和結(jié)構(gòu)的描述。
本發(fā)明是對(duì)Shiro框架進(jìn)行的二次開(kāi)發(fā),通過(guò)對(duì)Shiro框架提供的應(yīng)用程序編程接口中的一些核心類(lèi)進(jìn)行改裝,使得Shiro框架支持對(duì)Redis進(jìn)行Realm存儲(chǔ)。
圖2是根據(jù)本發(fā)明實(shí)施例的一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法的主要步驟示意圖。如圖2所示,本發(fā)明的一種基于Redis存儲(chǔ)的Shiro驗(yàn)證方法主要包括如下的步驟S21至S24。
步驟S21:根據(jù)用戶(hù)的登錄參數(shù),將用戶(hù)的標(biāo)識(shí)信息進(jìn)行封裝,生成唯一標(biāo)識(shí)。其中,用戶(hù)的標(biāo)識(shí)信息可以包括用戶(hù)的用戶(hù)名、域名及根據(jù)預(yù)定規(guī)則生成的特定標(biāo)識(shí)等。本發(fā)明中的特定標(biāo)識(shí)的值是一個(gè)定值字符串(例如:"login"),且該值不會(huì)發(fā)生變化。當(dāng)用戶(hù)進(jìn)行登錄操作時(shí),即可獲得用戶(hù)名、用戶(hù)的域名等信息。在對(duì)用戶(hù)的標(biāo)識(shí)信息進(jìn)行封裝時(shí),可根據(jù)需要選取不同的方法,例如,可選用哈希算法對(duì)用戶(hù)的標(biāo)識(shí)信息進(jìn)行運(yùn)算,以生成固定長(zhǎng)度的字符串,作為唯一標(biāo)識(shí)等。通過(guò)對(duì)用戶(hù)名及相關(guān)信息進(jìn)行封裝,使得用戶(hù)名等標(biāo)識(shí)信息成為唯一標(biāo)識(shí),以便后續(xù)從Redis服務(wù)器中進(jìn)行數(shù)據(jù)的存取操作。
步驟S22:根據(jù)所述唯一標(biāo)識(shí),查找Redis服務(wù)器中是否有對(duì)應(yīng)的緩存。在Redis中,數(shù)據(jù)是以Key-Value的形式進(jìn)行保存的,以唯一標(biāo)識(shí)作為Key進(jìn)行檢索,即可得到相應(yīng)的其他信息。通過(guò)對(duì)CachingSessionDAO類(lèi)進(jìn)行改造,將唯一標(biāo)識(shí)Key的會(huì)話(huà)信息放置于Redis中進(jìn)行緩存,可以對(duì)會(huì)話(huà)進(jìn)行統(tǒng)一的跨服務(wù)器管理,實(shí)現(xiàn)同一用戶(hù)多服務(wù)器統(tǒng)一權(quán)限管理。同時(shí),避免了會(huì)話(huà)存儲(chǔ)在cookie中帶來(lái)的安全問(wèn)題。
步驟S23:如果有對(duì)應(yīng)的緩存,則獲取所述唯一標(biāo)識(shí)的登錄信息, 并封裝登錄成功信息。查找到唯一標(biāo)識(shí)所對(duì)應(yīng)的緩存信息后,從中獲取登錄信息,例如:登錄時(shí)間、登陸次數(shù)及登錄成功時(shí)顯示的問(wèn)候語(yǔ)等,并將該登錄信息進(jìn)行轉(zhuǎn)換成可識(shí)別的字符顯示給用戶(hù),之后,將本次登錄成功的信息進(jìn)行封裝,驗(yàn)證結(jié)束。
其中,在獲取到登錄信息后,還可以更新該唯一標(biāo)識(shí)的過(guò)期時(shí)間。通過(guò)調(diào)用過(guò)期時(shí)間算法進(jìn)行計(jì)算,得到所述唯一標(biāo)識(shí)的過(guò)期時(shí)間并進(jìn)行更新。過(guò)期時(shí)間算法,主要包括下面的步驟:首先判斷兩次登錄驗(yàn)證期間是否有訪(fǎng)問(wèn)次數(shù)。如果有訪(fǎng)問(wèn)次數(shù),則判斷所述訪(fǎng)問(wèn)次數(shù)是否超過(guò)最大訪(fǎng)問(wèn)次數(shù);如果所述訪(fǎng)問(wèn)次數(shù)超過(guò)最大訪(fǎng)問(wèn)次數(shù),則取最大過(guò)期時(shí)間作為過(guò)期時(shí)間;否則,獲取過(guò)期時(shí)間增量值,并根據(jù)所述過(guò)期時(shí)間增量值、訪(fǎng)問(wèn)次數(shù)及默認(rèn)過(guò)期時(shí)間計(jì)算過(guò)期時(shí)間,此處過(guò)期時(shí)間=默認(rèn)過(guò)期時(shí)間+過(guò)期時(shí)間增量值*訪(fǎng)問(wèn)次數(shù)。如果沒(méi)有訪(fǎng)問(wèn)次數(shù),則將默認(rèn)過(guò)期時(shí)間作為過(guò)期時(shí)間。
通過(guò)引入過(guò)期時(shí)間,可以設(shè)置數(shù)據(jù)緩存的時(shí)間,到期自動(dòng)清除緩存數(shù)據(jù),解決了手動(dòng)清除緩存數(shù)據(jù)帶來(lái)的冗余和數(shù)據(jù)偏差,從而提高了緩存的效率和正確性,進(jìn)而提高了緩存的命中率。
步驟S24:如果沒(méi)有所述對(duì)應(yīng)的緩存,則調(diào)用登錄驗(yàn)證方法及權(quán)限驗(yàn)證方法進(jìn)行驗(yàn)證,若驗(yàn)證成功,封裝登錄成功信息,若驗(yàn)證失敗,提示登錄驗(yàn)證失敗。其中,所述登錄驗(yàn)證方法,包括:根據(jù)所述唯一標(biāo)識(shí)從Redis中獲取正確的用戶(hù)名并驗(yàn)證用戶(hù)輸入的用戶(hù)名是否合法;如果用戶(hù)輸入的用戶(hù)名合法,則根據(jù)所述唯一標(biāo)識(shí)從Redis中獲取正確的密碼并驗(yàn)證用戶(hù)輸入的密碼是否合法;如果用戶(hù)輸入的密碼合法,提示登錄驗(yàn)證成功;否則,提示登錄驗(yàn)證失敗;以及如果用戶(hù)輸入的用戶(hù)名不合法,則提示用戶(hù)輸入的用戶(hù)名錯(cuò)誤。
由步驟S21至步驟S24可以看出,通過(guò)將用戶(hù)名封裝為唯一標(biāo)識(shí),可以方便從Redis服務(wù)器中進(jìn)行數(shù)據(jù)的存取操作;將會(huì)話(huà)放置于Redis 中緩存,既減少了內(nèi)存消耗,解決了內(nèi)存溢出的問(wèn)題,同時(shí)在對(duì)登錄信息進(jìn)行驗(yàn)證時(shí),若Redis服務(wù)器的緩存中存在該唯一標(biāo)識(shí),則無(wú)需調(diào)用登錄驗(yàn)證方法及權(quán)限驗(yàn)證方法進(jìn)行驗(yàn)證,可使驗(yàn)證過(guò)程簡(jiǎn)化,從而提高了驗(yàn)證效率;通過(guò)引入過(guò)期時(shí)間算法來(lái)自動(dòng)清除緩存,解決了手動(dòng)清除緩存數(shù)據(jù)帶來(lái)的冗余和數(shù)據(jù)偏差,從而提高了緩存的效率和命中率,保證了數(shù)據(jù)高效、可靠地進(jìn)行存儲(chǔ)。
圖3是根據(jù)本發(fā)明實(shí)施方式的Shiro驗(yàn)證流程圖;圖4是根據(jù)本發(fā)明實(shí)施方式的登錄驗(yàn)證方法的實(shí)現(xiàn)流程圖;圖5是根據(jù)本發(fā)明實(shí)施方式的權(quán)限驗(yàn)證方法的實(shí)現(xiàn)流程圖;圖6是根據(jù)本發(fā)明實(shí)施方式的過(guò)期時(shí)間算法的實(shí)現(xiàn)流程圖;圖7是根據(jù)本發(fā)明實(shí)施方式的獲取緩存的方法的實(shí)現(xiàn)流程圖。以下將結(jié)合這些附圖對(duì)本發(fā)明的實(shí)施過(guò)程進(jìn)行詳細(xì)的介紹。
Shiro框架的Subject類(lèi)提供的login方法是登錄驗(yàn)證的入口,此方法會(huì)傳遞用戶(hù)的登錄參數(shù)信息,如用戶(hù)名和密碼等。如圖3所示,用戶(hù)輸入登錄參數(shù)(步驟S31),例如:用戶(hù)名(可以是手機(jī)號(hào)、郵箱或者自定義名稱(chēng))和密碼后,login方法將用戶(hù)名、域名及特定標(biāo)識(shí)(值為一個(gè)定值字符串,例如:"login",該值不會(huì)發(fā)生變化),進(jìn)行唯一標(biāo)識(shí)封裝(步驟S32),以便后續(xù)從Redis服務(wù)器中進(jìn)行數(shù)據(jù)的存取操作。之后,開(kāi)始驗(yàn)證(步驟S33)。以唯一標(biāo)識(shí)為查詢(xún)關(guān)鍵字,從Redis中查找是否有緩存(步驟S34),如果有緩存數(shù)據(jù),則獲取緩存中的登錄信息(步驟S36),并封裝登錄成功信息(步驟S37),否則,調(diào)用登錄驗(yàn)證方法及權(quán)限驗(yàn)證方法進(jìn)行驗(yàn)證(步驟S35),如果驗(yàn)證成功,執(zhí)行步驟S37,否則,提示驗(yàn)證失敗。特殊情況下,在訪(fǎng)問(wèn)某些比較關(guān)鍵的頁(yè)面內(nèi)容時(shí),即使已封裝登錄成功信息,也會(huì)要求對(duì)登錄信息進(jìn)行驗(yàn)證,此時(shí),會(huì)再次從步驟S33開(kāi)始執(zhí)行。
圖4是如圖3中所示的步驟S35中的登錄驗(yàn)證方法的具體流程。Shiro框架的AuthorizingRealm類(lèi)提供的登錄驗(yàn)證的方法是 doGetAuthenticationInfo方法,系統(tǒng)的登錄業(yè)務(wù)都將在該方法中完成。如圖4,當(dāng)用戶(hù)輸入登錄參數(shù)(用戶(hù)名、密碼)(步驟S41)后,login方法會(huì)封裝好唯一標(biāo)識(shí),登錄驗(yàn)證方法根據(jù)唯一標(biāo)識(shí)從Redis中獲取正確的用戶(hù)名(步驟S42),并與用戶(hù)輸入的用戶(hù)名比較,以判斷輸入的用戶(hù)名是否合法(步驟S43),如果不合法,則登錄驗(yàn)證失敗(步驟S47);否則,繼續(xù)驗(yàn)證,根據(jù)唯一標(biāo)識(shí)從Redis中獲取正確的密碼(步驟S44),并比較判斷輸入的密碼是否合法(步驟S45),如果合法,登錄驗(yàn)證成功(步驟S46),否則登錄驗(yàn)證失敗(步驟S47)。
圖5是如圖3中所示的步驟S35中的權(quán)限驗(yàn)證方法的具體流程。Shiro框架的AuthorizingRealm類(lèi)提供的權(quán)限驗(yàn)證的方法是doGetAuthorizationInfo方法,是在登錄驗(yàn)證完成之后,對(duì)用戶(hù)的權(quán)限進(jìn)行驗(yàn)證和授權(quán)。如圖5,登錄驗(yàn)證成功后,獲取合法參數(shù)(用戶(hù)名、密碼)(步驟S51),也就是之前輸入的登錄參數(shù),之后,根據(jù)唯一標(biāo)識(shí)從Redis中獲取角色信息(步驟S52),并進(jìn)行角色授權(quán)(步驟S53)。然后,根據(jù)唯一標(biāo)識(shí)從Redis中獲取權(quán)限信息(步驟S54),并進(jìn)行權(quán)限授權(quán)(步驟S55),對(duì)用戶(hù)的權(quán)限驗(yàn)證和授權(quán)完成后,用戶(hù)登錄成功,封裝登錄成功信息。
圖7是如圖3中所示的步驟S36中獲取緩存中的登錄信息的詳細(xì)步驟。在本發(fā)明的實(shí)施例中,引入過(guò)期時(shí)間算法對(duì)CacheManager類(lèi)的getcache方法進(jìn)行改造,采用對(duì)鍵名Key進(jìn)行過(guò)期時(shí)間管理的方式,解決手動(dòng)清除緩存數(shù)據(jù)帶來(lái)的冗余和數(shù)據(jù)偏差,提高緩存的命中率和緩存效率。如圖7所述的流程圖,首先是判斷緩存中,鍵名Key是否存在(步驟S71),此處的鍵名Key指的是唯一標(biāo)識(shí),如果不存在,則結(jié)束操作,否則,根據(jù)鍵名Key從Redis中獲取數(shù)據(jù)(步驟S72),此處的數(shù)據(jù)指的是需要用到的信息,例如:登錄成功標(biāo)識(shí)符、用戶(hù)名、過(guò)期時(shí)間等,之后,通過(guò)調(diào)用過(guò)期時(shí)間算法(步驟S73)計(jì)算得到過(guò)期時(shí)間,并更新鍵名Key的過(guò)期時(shí)間(步驟S74)。之后,進(jìn)行數(shù)據(jù)轉(zhuǎn)換(步驟S75),將步驟S72中獲取的數(shù)據(jù)轉(zhuǎn)換為可顯示給用戶(hù)的信息。
圖6是本發(fā)明的過(guò)期時(shí)間算法流程。首先,判斷在兩次登錄驗(yàn)證期間是否有訪(fǎng)問(wèn)次數(shù)(步驟S61),如果沒(méi)有,則獲取默認(rèn)過(guò)期時(shí)間(步驟S62)作為過(guò)期時(shí)間以更新過(guò)期時(shí)間(步驟S67);如果有,則繼續(xù)判斷兩次登錄驗(yàn)證期間的訪(fǎng)問(wèn)次數(shù)是否超過(guò)最大訪(fǎng)問(wèn)次數(shù)(步驟S63),如果超過(guò),則獲取最大過(guò)期時(shí)間(步驟S64)作為過(guò)期時(shí)間以更新過(guò)期時(shí)間(步驟S67);否則獲取過(guò)期時(shí)間增量值(步驟S65),并計(jì)算過(guò)期時(shí)間(步驟S66),過(guò)期時(shí)間=默認(rèn)過(guò)期時(shí)間+過(guò)期增量值*訪(fǎng)問(wèn)次數(shù)。本算法中出現(xiàn)的默認(rèn)過(guò)期時(shí)間、最大訪(fǎng)問(wèn)次數(shù)、最大過(guò)期時(shí)間、過(guò)期時(shí)間增量值均可以根據(jù)系統(tǒng)功能的要求進(jìn)行預(yù)先設(shè)定。例如,假設(shè)根據(jù)需要設(shè)置默認(rèn)過(guò)期時(shí)間為30分鐘,最大訪(fǎng)問(wèn)次數(shù)為50次,最大過(guò)期時(shí)間為3個(gè)小時(shí),過(guò)期時(shí)間增量值為2分鐘,在兩次登錄驗(yàn)證期間有5次訪(fǎng)問(wèn),則相應(yīng)的過(guò)期時(shí)間=30+2*5=40分鐘;如果兩次登錄驗(yàn)證期間有51次訪(fǎng)問(wèn),已超過(guò)最大訪(fǎng)問(wèn)次數(shù),則取最大過(guò)期時(shí)間作為過(guò)期時(shí)間,此時(shí),過(guò)期時(shí)間變成3個(gè)小時(shí)。
根據(jù)本發(fā)明實(shí)施例的技術(shù)方案,通過(guò)將用戶(hù)名封裝為唯一標(biāo)識(shí),可以方便從Redis服務(wù)器中進(jìn)行數(shù)據(jù)的存取操作;將會(huì)話(huà)放置于Redis中緩存,既減少了內(nèi)存消耗,解決了內(nèi)存溢出的問(wèn)題,同時(shí)在對(duì)登錄信息進(jìn)行驗(yàn)證時(shí),若Redis服務(wù)器的緩存中存在該唯一標(biāo)識(shí),則無(wú)需調(diào)用登錄驗(yàn)證方法及權(quán)限驗(yàn)證方法進(jìn)行驗(yàn)證,可使驗(yàn)證過(guò)程簡(jiǎn)化,從而提高了驗(yàn)證效率;通過(guò)引入過(guò)期時(shí)間算法來(lái)自動(dòng)清除緩存,解決了手動(dòng)清除緩存數(shù)據(jù)帶來(lái)的冗余和數(shù)據(jù)偏差,從而提高了緩存的效率和命中率,保證了數(shù)據(jù)高效、可靠地進(jìn)行存儲(chǔ)。
上述具體實(shí)施方式,并不構(gòu)成對(duì)本發(fā)明保護(hù)范圍的限制。本領(lǐng)域技術(shù)人員應(yīng)該明白的是,取決于設(shè)計(jì)要求和其他因素,可以發(fā)生各種各樣的修改、組合、子組合和替代。任何在本發(fā)明的精神和原則之內(nèi)所作的修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)范圍之內(nèi)。