我現在的想法是定義一個User
對象,其中包含uid
, username
, password
, isLogined
等。然後設定一個攔截器,在使用者第一次請求(session開始)的時候,從資料庫中根據user.isLogined
判斷使用者是否登錄,如果登入了就在session級別上設定isLogined
等於true,否則就重定向到登入頁面。
但是這樣的話在使用者第一次要求的時候,我該如何判斷使用者的身分?如果透過在cookie中設定uid
的話,這個uid可以被其他人偽造,有潛在的安全風險。
請問對於這個問題,有什麼好的解決方案?
我主要的問題就是如何判斷使用者登入身分的合法性,現在我的想法是將user id加密之後儲存到cookie當中,這把金鑰只有我一個人知道,這樣別人即使知道user id也沒有辦法,請問這樣是否合理。
這個風險好大:uid修改為別人的,碰巧那人也登入了,那麼就以別人的身分登入了
沿著你的方案走:
1,cookie的uid設定為加密的,或是無意義的隨機串
2,用這個串和db裡比對,或者和cache裡的比對,同時校驗ip或user agent加強安全性
3,要考慮會話過期策略
首先你的資料庫需要先儲存使用者信息,設定
isLogined
默认为FALSE
,每次登陆成功后更新为TRUE
,退出后更新为FALSE
;判断登陆成功的标志用userName userPass 匹配,还有isLogined
判断;最后设置判断级别,先isLogined
后用户密码
;建議登入狀態不要儲存在資料庫中,至少也別存在關係型資料庫中;可以在使用者登入校驗完成後,返回token,之後使用者的所有請求在headers的authorization欄位都帶上這個token;可以去了解一下jwt及相關實作
就按你現在的方式,如果我一個匿名用戶,沒登錄,去請求你的某個接口,然後被攔截從數據庫中根據user.isLogined判斷用戶是否登錄,那麼問題來了。你user.isLogined中的這個user是誰呢?
建議直接登入後把使用者登入成功資訊放session裡,請求的時候攔截器去驗證session就好了,不要去存取資料庫,每次要求都有這一個存取資料庫操作很有消耗的。