簡體   English   中英

節點js - 用戶身份驗證,在會話中存儲什么?

[英]Node js - user auth, what to store in session?

首先,我沒有找到任何有用的類似問題或材料。 如果我錯過了什么,我很抱歉!

其次,我對node-passportconnect-autheveryauth這樣的現成解決方案不感興趣

現在回答這個問題。 我正在使用Redis存儲快速會話。 我的問題是,當用戶進行身份驗證時(即在發布了用戶名和密碼的帖子並且在集合中找到了這樣的用戶之后)我應該在會話中存儲什么?

  1. 我可以存儲整個用戶對象(例如,它來自MongoDB的方式)。 我看到的一個缺點是,當用戶在DB中被修改(他編輯了他的個人資料)時,我必須在會話中“重新設置”用戶對象。 如果例如管理員更改了用戶的配置文件,則會變得更加復雜 - 在這種情況下,會話不知道用戶已被修改並且其數據需要從數據庫刷新,因此會話當前持有過時的用戶對象僅在用戶下次登錄時更新。

  2. 創建“hash => userid”的集合,並僅在會話中存儲哈希。 然后每個請求調用一個將檢查的中間件(下面的偽代碼,省略了對非現有哈希的檢查,在這種情況下,用戶可能被認為自會話過期后未登錄):

    if(userqsh in req.session)res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));

    這個方法明顯的缺點是hash => userid的附加集合(即mongodb)或key => value(即redis)存儲,這也需要一些程序來清理舊的會話哈希(將運行的計划任務\\ cron和刪除舊的過期哈希)。

  3. 類似於#2的另一種解決方案,而不是使用3-d party collection / key => value storage,將散列存儲為MongoDB中的部分User對象。 但是,此方法會消除額外的collection / redis鍵值,但仍需要計划任務來清除舊的過期會話。 並且由於過期會話可能會由“過期日期”屬性定義,因此更容易維護活動會話的3-d方集合,而不是將會話相關數據放入MongoDB中的User對象(從而使User對象變得龐大)。

我是Node-js的新手,這就是我要問的原因。 我也明白,可能沒有正確答案,或者可能與個人偏好有關。

謝謝!

與傳統框架(如PHP / ASP /無論如何)相比,Node / Express中的會話確實沒有什么特別之處。 用戶在PHP中登錄會怎么做?

只需將用戶ID存儲在會話中。 需要時從Mongo中提取用戶數據。

會話數據是安全的(因為客戶端不能像使用cookie那樣擺弄它),因此您可以依賴會話的用戶ID指向已經過適當身份驗證的用戶數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM