如何使用CakePHP 3将用户限制为一个会话?

pme*_*lon 7 session cakephp

我认证工作正常.用户可以登录和退出,没问题.问题是,如果用户共享登录,则他们都可以与一个用户同时登录.不好.

我需要在用户登录时知道CakePHP,我假设这是一个使用以下过程开始的过程:

'Session' => [
    'defaults' => 'database'
]
Run Code Online (Sandbox Code Playgroud)

根据Sessions书页.

然后我迷路了.除非我错过了它,否则没有提及将用户限制为每个活动会话.有没有人遇到过这个问题,如果有的话,你是如何解决这个问题的?

为了清晰:

从DB中删除所有会话以及在浏览器中删除的所有cookie =在访问/ users/login页面时都没有设置(顺便提一下,这已根据教程设置 - 没什么特别的).

Login = session在db中设置,其id与浏览器中的cookie相对应.正是你所期待的.

注销(然后重定向回登录)=删除旧会话,然后由DB和cookie中的另一个替换.不同的身份.所以有些东西正在拿起过期的cookie并刷新它.嗯.

cookie中保存的信息只是会话ID.在DB中它简单地说:

会话ID | 一个blob | 到期时间

Far*_*ide 5

我假设您将users和保存sessions在数据库中(默认情况下,在 cakePHP 中它被命名为sessions)。

添加一个active_session字段,在登录时更新它,根据请求检查它以确保当前用户会话 ID 与数据库中存储的最后一个匹配。

登录操作时执行以下操作:

UPDATE `users` SET `active_session`='$session_id';
Run Code Online (Sandbox Code Playgroud)

当用户转到需要登录的页面时,您搜索该值:

SELECT * FROM `users` WHERE `active_session` = '$session_id';
Run Code Online (Sandbox Code Playgroud)

如果用户在其他位置登录,则先前的会话密钥将被覆盖,并且上面的 SELECT 将返回结果集。

可以在更新之前清除旧的会话令牌,这样旧的会话将根据每个用户被销毁。


请注意,如果您正在使用AuthComponent,它可能会自行轮换会话,有关更多信息,您可以在CakePHP 手册的相应部分中找到。

我肯定会选择AuthComponent-way,并且不会在 CakePHP 中重新发明轮子。