java - 關(guān)于Spring MVC登錄系統(tǒng)的設(shè)計(jì)
問(wèn)題描述
我現(xiàn)在的想法是定義一個(gè)User對(duì)象,其中包括uid, username, password, isLogined等。然后設(shè)置一個(gè)攔截器,在用戶第一次請(qǐng)求(session開(kāi)始)的時(shí)候,從數(shù)據(jù)庫(kù)中根據(jù)user.isLogined判斷用戶是否登錄,如果登錄了就在session級(jí)別上設(shè)置isLogined等于true,否則就重定向到登錄頁(yè)面。
但是這樣的話在用戶第一次請(qǐng)求的時(shí)候,我應(yīng)該如何判斷用戶的身份?如果通過(guò)在cookie中設(shè)置uid的話,這個(gè)uid可以被其他人偽造,有潛在的安全風(fēng)險(xiǎn)。
請(qǐng)問(wèn)對(duì)于這個(gè)問(wèn)題,有什么好的解決方案?
補(bǔ)充我主要的問(wèn)題就是如何判斷用戶登錄身份的合法性,現(xiàn)在我的想法是將user id加密之后保存到cookie當(dāng)中,這把密鑰只有我一個(gè)人知道,這樣別人即使知道user id也沒(méi)有辦法,請(qǐng)問(wèn)這樣是否合理。
問(wèn)題解答
回答1:這個(gè)風(fēng)險(xiǎn)好大:uid修改為別人的,碰巧那人也登錄了,那么就以別人的身份登錄了
沿著你的方案走:1,cookie的uid設(shè)置為加密的,或者是無(wú)意義的隨機(jī)串2,用這個(gè)串和db里比對(duì),或者和cache里的比對(duì),同時(shí)校驗(yàn)ip或者user agent加強(qiáng)安全性3,要考慮會(huì)話過(guò)期策略
回答2:首先你的數(shù)據(jù)庫(kù)中需要先存儲(chǔ)用戶信息,設(shè)置isLogined 默認(rèn)為FALSE,每次登陸成功后更新為T(mén)RUE,退出后更新為FALSE;判斷登陸成功的標(biāo)志用userName userPass 匹配,還有isLogined 判斷;最后設(shè)置判斷級(jí)別,先isLogined 后 用戶密碼;
回答3:建議登錄狀態(tài)不要存儲(chǔ)在數(shù)據(jù)庫(kù)中,至少也別存在關(guān)系型數(shù)據(jù)庫(kù)中;可以在用戶登錄校驗(yàn)完成后,返回token,之后用戶的所有請(qǐng)求在headers的authorization字段都帶上這個(gè)token;可以去了解一下jwt及相關(guān)實(shí)現(xiàn)
回答4:就按你現(xiàn)在的方式,如果我一個(gè)匿名用戶,沒(méi)登錄,去請(qǐng)求你的某個(gè)接口,然后被攔截從數(shù)據(jù)庫(kù)中根據(jù)user.isLogined判斷用戶是否登錄,那么問(wèn)題來(lái)了。你user.isLogined中的這個(gè)user是誰(shuí)呢?
建議直接登錄后把用戶登錄成功信息放session里,請(qǐng)求的時(shí)候攔截器去驗(yàn)證session就好了,不要去訪問(wèn)數(shù)據(jù)庫(kù),每次請(qǐng)求都有這一個(gè)訪問(wèn)數(shù)據(jù)庫(kù)操作很有消耗的。
相關(guān)文章:
1. 在應(yīng)用配置文件 app.php 中找不到’route_check_cache’配置項(xiàng)2. html按鍵開(kāi)關(guān)如何提交我想需要的值到數(shù)據(jù)庫(kù)3. HTML 5輸入框只能輸入漢字、字母、數(shù)字、標(biāo)點(diǎn)符號(hào)?正則如何寫(xiě)?4. javascript - 請(qǐng)教如何獲取百度貼吧新增的兩個(gè)加密參數(shù)5. Android中能不能判斷一個(gè)數(shù)據(jù)庫(kù)是create來(lái)的,還是open來(lái)的?6. gvim - 誰(shuí)有vim里CSS的Indent文件, 能縮進(jìn)@media里面的7. 跟著課件一模一樣的操作使用tp6,出現(xiàn)了錯(cuò)誤8. PHP類屬性聲明?9. javascript - 求助canvas繪制馬賽克的問(wèn)題,老是取色不準(zhǔn)10. java - 安卓接入微信登錄,onCreate不會(huì)執(zhí)行
