除非你使用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的工具(我没有使用它) –