Session CakePHP:检查用户是否已经登录

Session CakePHP:检查用户是否已经登录,session,cakephp,Session,Cakephp,我试图禁止同一用户同时多次登录我的CakePHP(1.2)驱动的站点。然而,这并不像我想的那么容易,因为如果用户已经登录或没有登录,我不知道如何获取信息 我正在使用Cake的Auth组件对用户进行身份验证。会话由php安装处理,php将会话数据存储在文件中。因此,我猜不可能从控制器访问会话数据(当然,这些文件不会保存在webroot中)。我曾考虑使用一个特殊的数据库字段来检查用户是否登录,但如果用户不使用注销方法,只是简单地关闭浏览器并结束会话,则无法确定用户是否已注销 有人能想出另一种方法来管

我试图禁止同一用户同时多次登录我的CakePHP(1.2)驱动的站点。然而,这并不像我想的那么容易,因为如果用户已经登录或没有登录,我不知道如何获取信息

我正在使用Cake的Auth组件对用户进行身份验证。会话由php安装处理,php将会话数据存储在文件中。因此,我猜不可能从控制器访问会话数据(当然,这些文件不会保存在webroot中)。我曾考虑使用一个特殊的数据库字段来检查用户是否登录,但如果用户不使用注销方法,只是简单地关闭浏览器并结束会话,则无法确定用户是否已注销

有人能想出另一种方法来管理吗?我不需要知道每个登录用户的所有数据。我唯一需要知道的是,给定的用户名是否已登录

提前感谢。

我认为如果您在核心配置文件中将
Security.level
设置为
high
,CakePHP会自动出现这种行为,因为它每次都会重新生成会话ID

Configure::write('Security.level', 'high');

或者,其背后的逻辑是,您可以在用户登录时将用户IP/用户代理的哈希保存在用户表中,如果与您保存的哈希不同的计算机尝试执行某些操作,请注销该用户。这样,只有最新的用户才能工作

呵呵,比我快。当设置为high时,CakePHP已经检查用户代理(它将其散列并存储在会话文件中,因此不需要数据库字段)。有些用户在使用公共IP池的代理服务器后面,所以我不会检查IP的变化。这听起来很不错。但是会话ID的重新生成似乎有一个副作用,即登录的用户会随机注销。至少当security.level设置为“medium”时不会发生这种情况。我做错了什么吗?当你使用“高”时,超时会大大减少(*10)到*100),也许可以尝试增加Session.timeout配置变量。我设置Session.timeout设置为4320。到目前为止,这应该足够了(43200s=12h)。security.level high与Ajax不兼容。如果您有任何Ajax调用,您将无法使用最高级别。