sails.config.session
Sails 內建 session 支援的設定。
Sails 的預設 session 整合很大程度上借鑒了 Express 和 Connect 已完成的出色工作,但也透過 hook 到 request interpreter 加入了一些自己的特色。這讓 Sails 能夠在處理來自 Socket.IO 的虛擬請求時,存取和自動儲存您的程式碼對 req.session
所做的任何變更。最重要的是,無論您的 controller action 旨在處理 HTTP 請求、WebSocket 訊息或兩者,這都表示您可以像過去使用 Express 或 Connect 一樣,直接編寫使用 req.session
的程式碼。
屬性 | 類型 | 預設值 | 詳細資訊 |
---|---|---|---|
adapter |
未定義 |
如果未指定,Sails 將使用底層 session 中介軟體中捆綁的預設記憶體儲存區。這在開發環境中沒有問題,但在生產環境中,您必須傳入已安裝的可擴展 session 儲存模組的名稱 (例如 @sailshq/connect-redis )。請參閱下方的生產環境設定以取得詳細資訊。 |
|
name |
sails.sid |
當啟用 session 時(Sails 應用程式預設為啟用),要在回應中設定(以及在請求中讀取)的 session ID cookie 名稱。如果您從同一個共用 cookie 命名空間(即頂層 DNS 網域,如 frog-enthusiasts.net )執行多個不同的 Sails 應用程式,則必須特別注意為每個不同的應用程式設定單獨的唯一金鑰,否則可能會使用錯誤的 cookie。 |
|
secret |
不適用 | 此 session secret 會在建立新應用程式時自動產生。在生產環境中變更此 secret 時應謹慎,因為這樣做會使使用者的 session cookie 失效,迫使他們重新登入。請注意,這也用作已簽署 cookie 的「cookie secret」。 | |
cookie |
請參閱下方 | session ID cookie 的設定,包括 maxAge 、secure 等。請參閱下方以取得更多資訊。 |
|
isSessionDisabled |
(請參閱詳細資訊) | 每個請求都會執行的函式,如果它傳回「truthy」值,則會針對該請求停用 session 支援(即 req.session 將不存在)。預設情況下,此函式會根據 sails.LOOKS_LIKE_ASSET_RX 正則表達式檢查請求路徑,有效停用請求資源時的 session 支援。 |
如果您在開發環境中使用 Redis 作為 session 儲存區,則可以使用其他設定選項。大多數應用程式都可以使用 Sails 的預設 Redis 支援,如此處所述,但某些進階用例可能包含以下可選設定
屬性 | 類型 | 預設值 | 詳細資訊 |
---|---|---|---|
url |
未定義 |
要連接的 Redis 實例的 URL。這可能包含以下一個或多個設定,例如 redis://:[email protected]:1234/5 將指示 host 為 myredishost.com 、port 為 1234 、pass 為 mypass 以及 db 為 5 。一般來說,您應該使用 url 或以下設定的組合,以避免混淆。 |
|
host |
'127.0.0.1' |
您的 Redis 實例的主機名稱。如果已設定 url 設定,則會忽略此設定。 |
|
port |
6379 |
您的 Redis 實例的埠。如果已設定 url 設定,則會忽略此設定。 |
|
pass |
未定義 |
您的 Redis 實例的密碼。如果您未使用密碼,請留白。如果已設定 url 設定且包含密碼,則此設定將覆蓋 url 中的密碼。 |
|
db |
未定義 |
要在您的 Redis 實例中使用的資料庫索引。如果指定,則必須為整數。(在典型的 Redis 設定中,這將是 0 到 15 之間的數字。) 如果已設定 url 設定且包含 db,則此設定將覆蓋 url 中的 db。 |
|
client |
未定義 |
要使用的已連線 Redis client。如果提供,則會忽略任何 url 、host 和 port 設定。如果您有 Redis Sentinel 設定並且需要使用類似 ioredis 的模組進行連線,則此設定很有用 |
|
onRedisDisconnect |
未定義 |
如果 Redis 連線中斷,Sails 可以呼叫的可選函式。適用於將您的網站置於臨時維護模式或「panic mode」(請參閱 sails-hook-panic-mode 以取得範例)。 | |
onRedisReconnect |
未定義 |
如果先前中斷的 Redis 連線已還原,Sails 可以呼叫的可選函式(請參閱上方的 onDisconnect )。 |
|
handleConstructingSessionStore |
未定義 |
Sails 可以呼叫以取代標準 session 儲存區建構行為的可選覆寫函式。若要使用此設定,請先閱讀並理解相關原始碼。 |
注意:
onRedisDisconnect
和onRedisReconnect
僅適用於 Sails 為您建立的 Redis client;如果您提供自己的 Redis client(請參閱上方的client
選項),則在斷線或重新連線的情況下,將不會自動呼叫這些函式。
任何為 Connect/Express 撰寫的 session adapter 都可以在 Sails 中運作,只要您使用相容的版本即可。
Sails.js 的建議生產環境 session 儲存區是 Redis... 但我們意識到,對於某些應用程式來說,這並非一個選項。幸運的是,Sails.js 幾乎支援任何與 Connect/Express 相容的 session 儲存區——這表示您可以將 session 儲存在幾乎任何地方,無論是 Mongo、本機檔案系統,甚至是關聯式資料庫。查看 NPM 上提供的 Sails.js、Express 和 Connect 的社群 session 儲存區。
Sails 中的內建 session 整合透過使用 session ID cookie 來運作。此 cookie 是 HTTP-only(作為防範 XSS 漏洞 的安全措施),預設情況下,設定的名稱為「sails.sid」。
預設情況下,cookie 沒有針對同網站攻擊者的完整性。
在生產環境中,我們建議您在 cookie 的「name」(sails.config.session.name
)前加上「__Host-」前綴,以將 cookie 的範圍限制為單一來源。
您可以在此處閱讀更多關於「__Host-」前綴的資訊。
session: {
name: '__Host-sails.sid'
}
注意:新增此前綴需要將「secure」flag 設定為
true
。
您可以將應用程式的 session ID cookie 的最大期限/到期時間設定為毫秒數。
例如,在 24 小時後將使用者登出
session: {
cookie: {
maxAge: 24 * 60 * 60 * 1000
}
}
否則,預設情況下,此選項設定為 null
,表示 session ID cookie 不會發送任何類型的 「Expires」或「Max Age」標頭,並且僅在使用者的網頁瀏覽器開啟時持續有效。
是否在 session ID cookie 上設定 「Secure」flag。
session: {
cookie: {
secure: true
}
}
在您未使用 HTTPS 的開發期間,您應該將 sails.config.session.cookie.secure
保留為未定義(預設值)。
但在生產環境中,您需要將其設定為 true
。這會指示網頁瀏覽器,除非透過安全協定 (https://
),否則它們應拒絕傳回 session ID cookie。
注意:如果您在 proxy/負載平衡器後方使用 HTTPS——例如,在 PaaS (如 Heroku) 上——那麼您仍然應該設定
secure: true
。但請注意,為了讓 session 在啟用secure
的情況下運作,您還需要設定另一個名為sails.config.http.trustProxy
的選項。
在生產環境中?需要。
如果您依賴 Sails 的內建 session 整合,請始終在生產環境中使用 SSL 憑證。 否則,session ID cookie(或任何其他安全資料)可能會以純文字傳輸,這會讓咖啡店中的攻擊者有可能竊聽您的其中一位已驗證使用者的 HTTP 請求、攔截他們的 session ID cookie,然後偽裝成他們來大肆破壞。
還要意識到,即使您有 SSL 憑證,並且始終將 http://
重新導向到 https://
,對於所有子網域也是如此,設定 secure: true
仍然很重要。(因為如果沒有它,即使您立即重新導向所有 HTTP 流量,第一個請求仍然會透過 http://
發出,因此會以純文字傳輸 session ID cookie。)
若要查看其他可用選項(如「domain」)以在 Sails 中設定 session ID cookie,請參閱 express-session#cookie。
預設情況下,session 在 Sails 中啟用。若要在您的應用程式中停用 session,請透過變更您的 .sailsrc
檔案來停用 session
hook。停用 session
的過程與停用 Grunt hook 的過程相同(只需輸入 session: false
而不是 grunt: false
)。
注意:如果停用 session hook,則設定為
sails.config.session.secret
的 session secret 仍將用於支援已簽署 cookie(如果相關)。如果停用 session hook 且您的應用程式沒有 session secret 設定(例如,因為您刪除了config/session.js
),則已簽署 cookie 將無法在您的應用程式中使用。若要對此行為進行更進階的變更,您可以使用sails.config.http
手動自訂應用程式的任何 HTTP 中介軟體。