除非你使用websockets沒有辦法告訴用戶何時實際斷開連接,所以我看不到end_session是如何有意義的。如果你有所謂的「訪問」但是第三個表,即可以捕捉一個給定的會話下的所有HTTP請求:
CREATE TABLE user(
id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
salt VARCHAR(255) NOT NULL,
created DATETIME NOT NULL
);
CREATE TABLE session(
id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL,
user BIGINT NOT NULL,
created DATETIME NOT NULL
index(userid)
);
CREATE TABLE visit(
id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL,
ip VARCHAR(55) NOT NULL,
uri VARCHAR(255) NOT NULL,
method VARCHAR(20) NOT NULL,
userAgent TEXT NOT NULL,
session BIGINT NULL,
user BIGINT NULL,
created DATETIME NOT NULL
index(userid)
);
這將讓你捕獲有意義的數據。另外,如果您擔心特定會話在X分鐘後過期,請在驗證用戶會話時將X分鐘添加到創建的時間。或者當你正在尋找一個會話您可以在創建時的條件查詢:
SELECT
id,
user,
created
FROM session
WHERE created > {recent}
凡近期將等於當前時間 - X分鐘。
爲了更好的安全性,我建議爲每個會話生成一個隨機標記,將用戶的cookie值設置爲用戶ID和會話標記的AES GCM加密,然後生成一個隨機鹽來散列會話標記,最後存儲哈希會話令牌+數據庫中的salt。如果您僅僅將會話的ID與cookie的值進行比較,我可以以任何用戶的身份向系統進行身份驗證......如果您使用隨機生成的令牌,則可以進行同樣的操作。在此基礎上
我修改會話表看起來更象這樣:
CREATE TABLE session(
id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL,
user BIGINT NOT NULL,
token VARCHAR(255) NOT NULL,
salt VARCHAR(255) NOT NULL,
created DATETIME NOT NULL
index(userid)
);
最後,我注意到你在你的架構使用TIMESTAMP ...這是一般沒事的,只是要注意你只能存儲從1970年到2038年的日期。
如果你想看到的這個工作的例子,我有它在GitHub上的位置:https://github.com/kaeawc/play-encryption
這裏有一個工作演示:http://immense-garden-9877.herokuapp.com/
好,但我沒有看到任何領域表現插入,並懷疑可以通過相同的運行代碼進行監視。我們得到了監視JVM的工具(我沒有使用它) –