php - 如何获取 mysql 数据库更新以在 PHP session 中触发重新身份验证

标签 php mysql sql session authentication

启动 session 时,通过查询对数据库进行身份验证。如果这一身份验证被授予,一个或多个 session 变量将被填充数据。这允许用户在多个页面之间进行传输,而无需重新进行身份验证 - 这非常棒。但是,如果正在使用的 session 变量在数据库内发生更改,即用户名更改、访问权限更改,则这些更改不会波及到 session (显然)。

如何才能让数据库更改触发或影响 PHP session 变量。

一个示例是登录到您拥有访问权限 x 的网站,该权限允许您访问页面 1、2、3。您的权限现在由于某种原因被剥夺,您现在拥有访问权限 y,该权限仅允许您访问页面 1。如果用户已在站点内进行身份验证,这些更改将不会影响用户当前 session ,并且仍然能够访问第 2 页和第 3 页。在许多情况下这可能是一个问题。

目前我解决这个问题的方法是在每个页面重新验证用户身份,并相应地更新 session 变量。从我对 session (应该)如何工作的有限理解来看,这显然是完成这项任务的错误方法。

本质上,我想要一种数据库更新触发当前登录用户重新身份验证的方法。即,如果用户 john12 的数据库行被更改,那么他的 session 应该需要重新身份验证。

目前,我想不出有什么方法可以在每次加载页面时不查询数据库的情况下完成此操作。

任何提示或解决方案将不胜感激。

最佳答案

我通常的做法是在我的数据库中设置 4 个用于身份验证的字段。

  • 用户名
  • 密码(通常经过哈希处理)
  • token
  • 记录的 IP

我记得 cookie 中的用户身份验证数据。当用户输入正确的用户名和密码时,网站会生成一个新 token 并设置两个 cookie - 用户名和 token 。在每个页面加载时,您都会检查用户名、 token 和记录的 IP 是否匹配(以防止 token 被窃取)。如果其中一个不正确,请将其全部删除并重定向到登录页面。

在您的情况下,如果您想在更改密码时重新登录,只需在更改后删除 token 即可。

这里唯一的缺点是在给定时间只能记录一台机器。

<小时/>

我不明白为什么你不想在数据库中查询用户权限,即使有大量记录,SQL 数据库也非常快,尤其是通过主键搜索时。

关于php - 如何获取 mysql 数据库更新以在 PHP session 中触发重新身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48086987/

相关文章:

MySQL 选择行取决于特定列是否存在特定值

sql - 为什么即使我更改函数 COUNT() 内的参数,结果总是相同?

php - 将范围 slider 数据上传到 mysql 数据库

php - 获取 Laravel 中的当前语言

php - 如何获取 Paypal IPN中的item_number?

php - PHP 中的 MongoDB 使用聚合按 _id 分组无效

javascript - AJAX formdata 附近的表单验证

mysql - 基本 Solr 查询和数据结构

mysql - 将 2 列同一个表与另一列连接起来

sql - 如何将对列表传递给 Oracle 存储过程?