【发布时间】:2012-11-16 19:33:36
【问题描述】:
当会话存储在默认的 php 会话存储中时,有什么方法可以删除用户会话?
例如,我是网站管理员,我想禁止登录用户。用户认证状态存储在会话中。我正在从数据库中删除用户行,但仍然记录了用户,并且所有必要的身份验证信息也存储在会话中。我需要删除/修改会话。
可能的方法:
- 在每次请求时从数据库中加载用户行
- 创建文件,表示删除用户会话并在每次请求时检查此文件是否存在
- /dev/shm 中的crete 文件(检查速度非常快),但重新启动时文件将被删除
- 在数据库中存储会话(我的项目的开销)
- 在 nosql(redis、memcachedb)中存储会话(我的项目的开销)
除了将用户会话存储在数据库或 nosql 数据存储中之外,还有什么优雅的方法吗?
【问题讨论】:
-
我不太确定我是否遵循,但为什么不使用 session_destroy() - 或者只是取消设置用于检查登录状态的登录变量?
-
@jtheman 他在说管理员面板禁用用户。不是用户做的事情会禁用他的帐户并破坏他的会话。
-
默认 php 会话存储是基于文件的。要在外部杀死一个会话,你需要知道会话的ID,然后删除对应的会话文件(通常
sess_XXX,其中xxx是会话ID)。可能“禁止用户”脚本中的 5 行代码(最多)可以完成此操作,即使只是unlink(session_save_path() . "/sess_$bannedID")也可以。 -
据我了解,会话只能由创建它们的用户访问。因此,您必须在每个请求上加载用户的行(或该信息的一小部分)。但我不是专家,对不起。 php.net/manual/en/session.security.php为
-
@Ray 好的,现在我明白了。是的,将会话 ID 保存在数据库中,然后禁止用户,而不仅仅是删除数据库中的用户会话。还有会话文件...
标签: php