0

假设我们面前有这个很棒的用户系统,用户通过设置会话密钥(user_id)登录。但是,如果用户被“禁止”,则该用户仍将登录 - 直到会话到期。

防止这种情况的方法是:

  1. 始终检查用户是否被禁止(每个请求)

  2. 将会话数据保存在数据库中以便能够轻松删除数据(在用户被禁止时)。

有没有更好的方法来执行这项任务?

4

4 回答 4

1

我会选择1。如果您没有在每个请求中从数据库中检索用户信息,用户也可能无法更新他们的数据。例如,我可以在家登录,将我的个人资料描述更改为“foo”并开始工作。我也在那里登录,这会导致不同的会话。我将信息更改为“bar”,它存储在数据库和我的工作会话中。然后我回家继续浏览之前打开的家庭会话,它仍然包含“foo”。

因此,我认为您至少应该对每个请求的用户数据库进行一些检查,因此在该步骤中您可以检查用户是否也被禁止。

为了加快速度,您可以保留一个存储类型为 MEMORY 的特殊表来保存会话信息。该表可以非常快速地访问,因此可以提高性能。如果用户在“真实”数据库中发生更改,您只需将信息移动到那里。您可以以类似的方式使用 memcache。两者都是在保持相同结果的同时将数据库 IO 保持在最低限度的解决方案。我只会在您需要时添加这些优化。首先在每个请求上查询用户。

于 2012-11-23T09:25:53.000 回答
0

只需在会话中包含上次检查它是否已被禁止的时间。然后定期根据用户表的禁止列表检查它。

于 2012-11-23T09:21:37.403 回答
0

你必须检查它的每个请求user_id。计算量不大。您可以使用RedisMemcached等内存存储来存储user_id=>banned对以快速检查它。第二个不起作用,因为会话不稳定,我可以从不同的计算机登录,甚至是浏览器,你将需要复杂的逻辑和更多的资源来执行这样的任务。

于 2012-11-23T09:28:11.417 回答
0

您真的不想在每个请求上都连接到您的数据库,因为这将大大增加具有许多用户的服务器上的加载时间——这不是最好的做法。

但是,您可以使用它Memcache来存储和检索被禁止用户的列表 - 从而加快您的数据请求时间。

 if((isset($_SESSION['isloggedin']) && $memcache->get('banneduserid') === true))
 {
     session_unset(); 
     session_destroy();
 }

Memcache非常易于使用,如果您以前没有使用过它,学习起来也很有趣。

例如,您将 memcache 对象实例化为 $memcache,然后您只需运行和 之类的$memcache->set()方法$memcache->get()。就是这样!

于 2012-11-23T09:47:27.577 回答