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

Session 如何使用CakePHP 3将用户限制为一个会话?,session,cakephp,Session,Cakephp,我的auth工作得很好。用户可以登录和注销,没有问题。问题是,如果用户共享一个登录名,那么他们可以与一个用户同时登录。不太好 我需要让CakePHP知道用户何时登录,我假设这是一个使用以下命令启动的进程: 'Session' => [ 'defaults' => 'database' ] 根据书页上的内容 然后我就迷路了。除非我错过了它,否则没有提到将用户限制为每个活动会话。以前有没有人遇到过这个问题?如果有,你是如何解决的 为了澄清: 从数据库中删除的所有会话和在浏览器中

我的auth工作得很好。用户可以登录和注销,没有问题。问题是,如果用户共享一个登录名,那么他们可以与一个用户同时登录。不太好

我需要让CakePHP知道用户何时登录,我假设这是一个使用以下命令启动的进程:

'Session' => [
    'defaults' => 'database'
]
根据书页上的内容

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

为了澄清:

从数据库中删除的所有会话和在浏览器中删除的所有Cookie=在访问/users/login页面时未设置任何内容(顺便说一句,这是根据教程设置的-没有任何内容)

Login=数据库中设置的会话,id对应于浏览器中的cookie。正是你所期望的

注销(然后重定向回登录)=旧会话被删除,然后被数据库和cookie中的另一个会话替换。不同的id。所以有东西正在拾取过期的cookie并刷新它。嗯

cookie中保存的信息只是会话id。在DB中,它只是:


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

我假设您将
用户
会话
保存在数据库中(默认情况下在cakePHP中命名为
会话

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

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

UPDATE `users` SET `active_session`='$session_id';
当用户转到需要登录的页面时,您将搜索该值:

SELECT * FROM `users` WHERE `active_session` = '$session_id';
如果用户在其他位置签名,则上一个会话密钥将被覆盖,并且上面的选择返回一个空结果集

可以在更新之前清除旧会话令牌,因此,这种方式将根据每个用户销毁旧会话


请小心,如果您使用的是
AuthComponent
,它可能会旋转会话本身,有关详细信息,请参阅


我肯定会去,也不会在CakePHP中重新发明轮子。

我将用户绑定到他们的手机上。每天他们都会通过twilio短信获得一个新的6位数代码。使共享登录变得困难,但并非不可能。最后,我想跟踪用户每天使用多少台不同的机器,并建立一些合理使用限制。如果一个用户一天使用三台或四台机器,这很好,但是当他们开始一天在二十台或五十台机器上使用相同的用户id时,这可能是一个问题。

因为您使用的是数据库会话,所以您可以在该用户登录时查询会话表,并在登录之前删除该用户的所有会话。不过,这更像是一种变通方法。有点相关:谢谢你。我已经发展到这样一个地步:注销时会话被删除,但当用户被重定向到用户/登录页面时,另一个会话立即被重新创建(没有他们登录!这让我发疯了!)。我找不到设置此cookie/会话的内容。解释以下步骤:没有cookie的用户访问/users/login(没有cookie/session集)、登录(所有精细会话显示在db中)、注销(会话在db中终止)并重定向到/users/login。然后,在登录提示下,无需用户交互,用户在数据库中有一个活动会话。奇怪。当你直接从数据库中删除会话时,它不会从他们的系统中删除cookie,但是他们系统上的cookie应该是无用的,因为它在你的数据库中没有任何关联的数据。通过删除会话而注销的用户应该无法执行任何需要登录的操作。你看到了不同的行为吗?奇怪的是在登录之前设置了一个新的cookie。此cookie中的id字符串与数据库中创建的id字符串匹配。但与此同时,他们必须要求登录凭据才能执行任何操作。我试图找出auth的哪一部分正在寻找过期的cookie并生成一个新的cookie。这对你来说有意义吗?你并没有用@dragmosh来回答这个问题,即在注销之后,数据库中的“新”会话是否真的包含任何用户信息(我怀疑这一点,除非出现严重错误)?正在刷新的会话完全正常,并且符合预期的行为,您不能同时拥有会话和不拥有会话,您的应用程序使用会话或不使用会话,重要的是用户信息正在被删除。非常感谢-将测试并报告。从目前的测试来看,AuthComponent似乎只在注销/超时时更改会话id。@pmelon-期待听到您的测试结果。我很快就要在一个项目中面对这个确切的情况。@Farside-谢谢你的回答,我开始怀疑这个问题是否会得到爱!感谢您也给出了详细的回答。这个答案帮助很大,但它没有解释如何使用CakePHP首选方法(AuthComponent)。如果答案可以通过这种方式得到改进,或者可以用示例代码提供一个新的答案,那就太好了。