久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Shiro中Session和Cookie的一些思考 | z77z的小碼窩 | 年少無(wú)為,,賣(mài)碼為生,。

 airen89 2018-09-18

這篇博客就來(lái)寫(xiě)一寫(xiě)之前學(xué)習(xí)shiro框架整合的時(shí)候,產(chǎn)生的一些問(wèn)題,,相信大家在學(xué)習(xí)的時(shí)候也有相應(yīng)的一些疑惑,。接下來(lái)就針對(duì)shiro中的session和cookie來(lái)捋一捋。

shiro整合學(xué)習(xí)的總結(jié)


  1. shiro+redis集成,,避免每次訪問(wèn)有權(quán)限的鏈接都會(huì)去執(zhí)行MyShiroRealm.doGetAuthenticationInfo()方法來(lái)查詢當(dāng)前用戶的權(quán)限,,因?yàn)閷?shí)際情況中權(quán)限是不會(huì)經(jīng)常變得,這樣就可以使用redis進(jìn)行權(quán)限的緩存,。

  2. 實(shí)現(xiàn)shiro鏈接權(quán)限的動(dòng)態(tài)加載,,之前要添加一個(gè)鏈接的權(quán)限,要在shiro的配置文件中添加filterChainDefinitionMap.put(“/add”, “roles[100002],,perms[權(quán)限添加]”),,這樣很不方便管理,一種方法是將鏈接的權(quán)限使用數(shù)據(jù)庫(kù)進(jìn)行加載,,另一種是通過(guò)init配置文件的方式讀取,。

  3. Shiro 自定義權(quán)限校驗(yàn)Filter定義,及功能實(shí)現(xiàn),。

  4. Shiro Ajax請(qǐng)求權(quán)限不滿足,,攔截后解決方案。這里有一個(gè)前提,,我們知道Ajax不能做頁(yè)面redirect和forward跳轉(zhuǎn),,所以Ajax請(qǐng)求假如沒(méi)登錄,那么這個(gè)請(qǐng)求給用戶的感覺(jué)就是沒(méi)有任何反應(yīng),,而用戶又不知道用戶已經(jīng)退出了,。

  5. 控制同一個(gè)用戶的在線數(shù)量,。(擠出之前的登錄用戶)

  6. Shiro 登錄后跳轉(zhuǎn)到最后一個(gè)訪問(wèn)的頁(yè)面

  7. 在線顯示,在線用戶管理(踢出登錄),。

  8. 登錄注冊(cè)密碼加密傳輸,。

  9. 集成動(dòng)態(tài)驗(yàn)證碼。

  10. 記住我的功能,。關(guān)閉瀏覽器后還是登錄狀態(tài),。

·······················································································································································

個(gè)人博客:http://z77z./

此項(xiàng)目下載地址:https://git.oschina.net/z77z/springboot_mybatisplus

·······················································································································································

session


session是大家比較熟悉的功能,因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,,網(wǎng)站為了在多個(gè)請(qǐng)求之間傳遞數(shù)據(jù)就使用了session這個(gè)東西,,session是存儲(chǔ)在網(wǎng)站服務(wù)器上的某個(gè)地方,比如內(nèi)存,、數(shù)據(jù)庫(kù)或者其他的什么東西,,在我的配置中是用redis存儲(chǔ)的,因?yàn)槲沂褂昧薙hiro的Native Session Manager,,替代了Tomcat本身的Session Manager,,并且為Shiro的Native Session Manager配置了redis的SessionDAO,當(dāng)然這個(gè)我是直接使用的一個(gè)開(kāi)源插件,,里面已經(jīng)幫我們很好的實(shí)現(xiàn)了cacheManager,,sessionManager,redisSessionDAO這些,。直接使用就可以了,。

shiro_redis插件地址:http://www.oschina.net/p/shiro-redis

所以所有的session會(huì)話都是緩存在redis里面的。對(duì)session的增刪改查都是在操作redis數(shù)據(jù)庫(kù)來(lái)完成,。所以如果將redis進(jìn)行集群的話,,session會(huì)話也就會(huì)達(dá)到集群的目的。后面我專(zhuān)門(mén)寫(xiě)博客來(lái)分享,。

在這種情況下服務(wù)器的Session就存儲(chǔ)在redis里面,,如果某個(gè)Session過(guò)期(比如關(guān)閉了瀏覽器或者超時(shí)),此條Session就會(huì)從redis里面永久刪除,,下次的請(qǐng)求將不能使用Session里面的數(shù)據(jù),。所以說(shuō)即使有些url設(shè)置的是”user”級(jí)別的(也就是說(shuō)不用登錄即可訪問(wèn),只須設(shè)置了rememberMe),,但是如果這些url使用了Session里面的數(shù)據(jù),,就會(huì)拋出異常,因?yàn)榇藭r(shí)這個(gè)用戶對(duì)應(yīng)的Session已經(jīng)不存在了,。

cookie


當(dāng)瀏覽一個(gè)網(wǎng)站的時(shí)候,,網(wǎng)站返回給你一個(gè)Session Cookie和一個(gè)RememberMe Cookie,Session Cookie很好理解,,就是為了此次的對(duì)話,,一旦關(guān)閉了瀏覽器或者超時(shí)了Session Cookie就沒(méi)用了,。但是RememberMe Cookie不太一樣,Shiro默認(rèn)的RememberMe Cookie的時(shí)長(zhǎng)是一年,,所以不用擔(dān)心這個(gè)Cookie的情況。RememberMe Cookie實(shí)際就是Shiro把這個(gè)用戶的信息加密一下放到cookie里面,,下次就可以根據(jù)這個(gè)cookie來(lái)進(jìn)行判斷這是哪個(gè)用戶,。

主要講下shiro的rememberMe cookie。在shiro中有一個(gè)類(lèi)實(shí)現(xiàn)了rememberMe功能,, org.apache.shiro.web.mgt.CookieRememberMeManager ,。在登錄時(shí),代碼也很簡(jiǎn)單:

1
2
3
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
token.setRememberMe(true);
subject.login(token);

RememberMe這個(gè)參數(shù)設(shè)置為true后,,在登陸的時(shí)候就會(huì)在客戶端設(shè)置remenberme的相應(yīng)cookie,。下次訪問(wèn)帶上這個(gè)cookie,訪問(wèn)鏈接為user鏈接器的,,就不需要進(jìn)行登錄驗(yàn)證,,直接進(jìn)入權(quán)限驗(yàn)證。下面是完整的處理過(guò)程:

  • 得到principals對(duì)象
  • 通過(guò)配置的key,,使用aes加密
  • 將加密后的值再通過(guò)base64解密
  • 當(dāng)客戶端帶著這個(gè)rememberMe cookie訪問(wèn)時(shí),,將會(huì)按照下面的過(guò)程來(lái)尋找已記住的身份信息:
  • 獲取rememberMe cookie的值
  • Base64解碼
  • 使用AES解密
  • 使用ObjectInputStream進(jìn)行反序列化

這樣不需要進(jìn)入身份驗(yàn)證的攔截器,就直接從cookie中獲取到了登錄信息,。

未解決疑惑


session整個(gè)流程很好理解,,我們使用的插件,對(duì)session的操作理解可以去看我之前寫(xiě)的在線用戶管理和控制在線人數(shù)功能,,基本都是對(duì)session的操作,。

https://my.oschina.net/z707z/blog/852189

對(duì)于cookie我又下面幾點(diǎn)疑惑,忘大神指點(diǎn):

  1. 我在測(cè)試的時(shí)候,,使用了remenberme的功能后,,我將登錄生成的cookie復(fù)制出來(lái),我不管重新登錄相同用戶多少次,,我?guī)线@個(gè)cookie訪問(wèn)的時(shí)候,,還是不會(huì)走身份驗(yàn)證這個(gè)攔截器。只走權(quán)限驗(yàn)證的攔截器,,也就是說(shuō)用戶在使用退出登錄后,。之前的cookie還是有效的。并沒(méi)有清除,。怎么清除cookie,。不是所清除客戶端的cookie,而是清除服務(wù)器記住的cookie序列化文件,。

  2. 有沒(méi)有什么好的方法可以防止盜取cookie,,進(jìn)行xss攻擊,。

網(wǎng)上找了一個(gè)思路:

  1. 用戶選擇了 “記住我” 成功登錄后,將會(huì)把 username,、隨機(jī)產(chǎn)生的序列號(hào),、生成的 token 存入一個(gè)數(shù)據(jù)庫(kù)表中,同時(shí)將它們的組合生成一個(gè) cookie 發(fā)送給客戶端瀏覽器,。
  2. 當(dāng)下一次沒(méi)有登錄的用戶訪問(wèn)系統(tǒng)時(shí),,首先檢查 cookie,如果對(duì)應(yīng) cookie 中包含的 username,、序列號(hào)和 token 與數(shù)據(jù)庫(kù)中保存的一致,,則表示其通過(guò)驗(yàn)證,系統(tǒng)將重新生成一個(gè)新的 token 替換數(shù)據(jù)庫(kù)中對(duì)應(yīng)組合的舊 token,,序列號(hào)保持不變,,同時(shí)刪除舊的 cookie,重新生成包含新生成的 token,,就的序列號(hào)和 username 的 cookie 發(fā)送給客戶端,。
  3. 如果檢查 cookie 時(shí),cookie 中包含的 username 和序列號(hào)跟數(shù)據(jù)庫(kù)中保存的匹配,,但是 token 不匹配,。這種情況極有可能是因?yàn)槟愕?cookie 被人盜用了,由于盜用者使用你原本通過(guò)認(rèn)證的 cookie 進(jìn)行登錄了導(dǎo)致舊的 token 失效,,而產(chǎn)生了新的 token,。這個(gè)時(shí)候 shiro就可以發(fā)現(xiàn) cookie 被盜用的情況,它將刪除數(shù)據(jù)庫(kù)中與當(dāng)前用戶相關(guān)的所有 token 記錄,,這樣盜用者使用原有的 cookie 將不能再登錄,,同時(shí)提醒用戶其賬號(hào)有被盜用的可能性。
  4. 如果對(duì)應(yīng) cookie 不存在,,或者包含的 username 和序列號(hào)與數(shù)據(jù)庫(kù)中保存的不一致,,那么將會(huì)引導(dǎo)用戶到登錄頁(yè)面。

這樣處理有一個(gè)不好的地方就是:必須要每次用戶要再次操作的時(shí)候才會(huì)發(fā)現(xiàn)cookie被盜用,,如果被盜用的cookie是用戶最后一次操作生成的cookie吶,。

我到覺(jué)得控制用戶登錄人數(shù)為只能一個(gè)人登錄一個(gè)賬號(hào),還比上面這個(gè)方便些,,不會(huì)反復(fù)的生成cookie,,寫(xiě)入cookie。但是也不好,,沒(méi)有解決服務(wù)器上的cookie沒(méi)有根據(jù)用戶的退出而失效的這個(gè)問(wèn)題,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多