首先,您必須決定如何在瀏覽器中保持狀態:您打算使用會話cookie還是在每個頁面上傳遞會話令牌?如果使用cookie方式,則不必更改頁面和表單,但如果尚未存在,請添加cookie管理(請小心使用session + httpOnly cookie)
然後您必須決定如何獲取有關服務器狀態的數據:如果您已經在使用數據庫,則可以添加一個帶有「SESSION_ID」和「EXPIRATION_DATE」列的「SESSION」表以及名爲「SESSION_DATA」的第二個表,其中列「SESSION_ID」 , 「核心價值」。
現在「只是」需要創建一些簡單的功能:
int session_createNewSession(long& session_id, long duration)
int session_setValue(long session, char[] key, char[] value)
int session_getValue(long session, char[] key, char[] value)
int session_abandonSession(long session)
此函數將返回錯誤代碼,如果會議不能創建或價值不能設置/獲取。您還應該創建一個定期在數據庫上運行的作業,以刪除較舊的會話。
現在,你有你的會話系統到位,其餘部分是相當簡單:
- 創建一個登錄表單
- 在CGI通過檢查處理接收到的數據,如果登錄/密碼是正確的(不存儲在數據庫中的密碼,但:存儲鹽漬哈希)
- 如果接頭是OK,保存會話的用戶ID(或你的情況,你可以只保存一個「IsAdmin」值)
事實上你可以做得更簡單:只要一個session_createNewSession(long & session_id,int isAdmin)就足夠你的情況(只有一個數據庫表),但你的客戶端可能會隨着時間的推移要求更多的功能是不是他?
最後一點:小心你的session_id是隨機的,而不是縮進字段,否則劫持別人的會話將會非常簡單。
我怎麼會「標誌」,而且我應該做的檢查,如果客戶端登錄和授權是什麼?將密碼的密碼散列存儲在Cookie密鑰中?這種方法很有趣;我肯定會喜歡這種方式來做這種簡單的事情。 – 2011-03-02 11:48:39
@Delan密碼的哈希值將不夠用,因爲它不會頻繁更改,因此很容易被劫持。這將是一個像日期加上一些應用程序狀態加鹽的散列。如果客戶端發送了正確簽名且未過期的cookie,則他已登錄並獲得授權。 – 2011-03-02 12:02:36
@Delan一個更好的哈希將是一個存儲在cookie中的時間戳+固定的時間間隔(n天+ x小時+ y分鐘+ z秒)+鹽。這將是個人和更容易創建和檢查。 – 2011-03-11 00:53:46