我认证工作正常.用户可以登录和退出,没问题.问题是,如果用户共享登录,则他们都可以与一个用户同时登录.不好.
我需要在用户登录时知道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 | 到期时间
我假设您将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 中重新发明轮子。