2014-03-28 27 views
1

通過瀏覽Auth和Session snaplets的代碼,我發現會話信息只存儲在客戶端(作爲cookie中的加密密鑰/值存儲)。會話的一種常用方法是僅將會話令牌存儲到客戶端,然後在服務器上的數據存儲中獲取剩餘的會話信息(到期日期,鍵/值對)。 Snap的方法的基本原理是什麼?爲什麼只有Snap Framework客戶端的會話?

對我來說,客戶端僅會話的缺點是:

  1. 的鍵/值存儲可能會大,並使用大量的帶寬。如果會話僅用於驗證用戶,這不是問題。

  2. 一個依靠客戶端過期/刪除cookie。如果服務器上至少有一部分會話沒有在設置cookie時有效地發送一個對永久有效的令牌。

後續問題是在Snap中實現服務器端會話的自然方式。理想情況下,我只想編寫/修改身份驗證和/或會話後端。

回答

3

簡化和最小化依賴關係。我們一直強烈認爲,核心捕捉框架應該與數據庫無關。如果你仔細觀察組織,你會發現我們用一個核心API仔細設計了會話系統,這個API完全是後端不可知的。然後我們包含了一個cookie後端。這爲用戶提供了可行的功能,而無需強制特定的持久性系統。它也可以作爲如何根據您選擇的其他機制編寫您自己的後端的示例。

我們在auth系統中也使用了相同的模式。這是一個核心API,可以讓你使用任何你想要的後端。如果您想爲其中任何一個編寫自己的後端,請查看現有實現並將其用作指導。 Cookie後端是我所知道的唯一一個會話,但auth有幾個:包含簡單文件的cookie,以及包含在snaplet-postgresql-simplesnaplet-mysql-simplesnaplet-persistent中的那些。

+0

好的,謝謝,我明白。所以管理核心對於會話沒有特別的方法;它只是提供了界面,並且提供了一個示例來展示如何實現它並讓人們前往。我想我將能夠弄清楚如何實現持久cookie後端。 – dermoritz

+0

@dermoritz你最終做到了嗎?我也希望能夠在註銷時使服務器端的會話cookie失效,並且我驚訝地發現cookieSessionManager似乎不支持這種cookie。 – rcreswick

+0

@rcreswick,對不起。實際上我最終切換到了[servant](https://hackage.haskell.org/package/servant)(當然,你也必須手動進行這種會話處理)。 :) – dermoritz