假设我们面前有这个很棒的用户系统,用户通过设置会话密钥(user_id)登录。但是,如果用户被“禁止”,则该用户仍将登录 - 直到会话到期。
防止这种情况的方法是:
始终检查用户是否被禁止(每个请求)
将会话数据保存在数据库中以便能够轻松删除数据(在用户被禁止时)。
有没有更好的方法来执行这项任务?
假设我们面前有这个很棒的用户系统,用户通过设置会话密钥(user_id)登录。但是,如果用户被“禁止”,则该用户仍将登录 - 直到会话到期。
防止这种情况的方法是:
始终检查用户是否被禁止(每个请求)
将会话数据保存在数据库中以便能够轻松删除数据(在用户被禁止时)。
有没有更好的方法来执行这项任务?
我会选择1。如果您没有在每个请求中从数据库中检索用户信息,用户也可能无法更新他们的数据。例如,我可以在家登录,将我的个人资料描述更改为“foo”并开始工作。我也在那里登录,这会导致不同的会话。我将信息更改为“bar”,它存储在数据库和我的工作会话中。然后我回家继续浏览之前打开的家庭会话,它仍然包含“foo”。
因此,我认为您至少应该对每个请求的用户数据库进行一些检查,因此在该步骤中您可以检查用户是否也被禁止。
为了加快速度,您可以保留一个存储类型为 MEMORY 的特殊表来保存会话信息。该表可以非常快速地访问,因此可以提高性能。如果用户在“真实”数据库中发生更改,您只需将信息移动到那里。您可以以类似的方式使用 memcache。两者都是在保持相同结果的同时将数据库 IO 保持在最低限度的解决方案。我只会在您需要时添加这些优化。首先在每个请求上查询用户。
只需在会话中包含上次检查它是否已被禁止的时间。然后定期根据用户表的禁止列表检查它。
您真的不想在每个请求上都连接到您的数据库,因为这将大大增加具有许多用户的服务器上的加载时间——这不是最好的做法。
但是,您可以使用它Memcache
来存储和检索被禁止用户的列表 - 从而加快您的数据请求时间。
if((isset($_SESSION['isloggedin']) && $memcache->get('banneduserid') === true))
{
session_unset();
session_destroy();
}
Memcache非常易于使用,如果您以前没有使用过它,学习起来也很有趣。
例如,您将 memcache 对象实例化为 $memcache,然后您只需运行和 之类的$memcache->set()
方法$memcache->get()
。就是这样!