[英]Count multiple login and logout session
我正在设计一个系统,用户应在该系统中注册特定的时间,然后注销。 他一天中可能会多次登录和注销。 我必须数所有这些会话以衡量性能。
所以最好的方式为此设计数据库
create table scheduler(
ID bigint auto_increment,
userID varchar(100),
start_session TIMESTAMP,
end_session TIMESTAMP,
primary key(ID),
INDEX(userID)
)
我必须插入一个用户的多个会话数据。 那么对我想要的任务而言,这是合乎逻辑的设计吗? 一个更多的信息,这将是一个实时系统。
create table允许说“ logins”且字段很少,一个应该是:
entrie_id
userID(实际上是用户的双向标识符)
日期(代表当前日期)
login_amount(每次用户登录时应增加)默认值0。
有了这个,您将每天都有静电。
用户登录后包括更新数据库。
例如,如果用户使用ID 1登录并且今天是2014-02-14。
您将必须在登录表中搜索userID = 1和数据2014-02-14(在我们的情况下为今天),如果通过搜索这些错误而创建,请使用今天的日期和用户ID创建新条目,否则更新logins_amount乘以1,因此,如果是首次登录,则应该执行0 + 1,这样您的总登录数为1。
编辑:显然,对于注销,您可以只在注销脚本部分执行相同的操作。 为此,您可能需要添加另一个字段logout_amount等。
除非您使用websocket,否则无法告诉用户何时断开连接,因此我看不到end_session的意义。 但是,如果您有名为“ visit”的第三个表,则可以捕获给定会话下的所有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加密,然后生成一个随机的盐来对会话令牌进行哈希处理,最后存储哈希的会话令牌+盐在数据库中。 如果您仅将会话的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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.