【问题标题】:Perform a certain task when action is performed执行动作时执行特定任务
【发布时间】:2012-11-11 15:14:30
【问题描述】:

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

防止这种情况的方法是:

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

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

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

【问题讨论】:

  • 如果您选择第二种方法,请记住您只能将会话标识符保存在数据库中,然后在阻止用户时保存use it to kill this session(s)
  • 如果某人被禁止,该禁令需要一段时间才能执行是否重要?

标签: php


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        Memcache 真的很容易使用,如果你以前没有用过它,学习它很有趣。

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

        【讨论】:

        • 还有一个很好的建议是,您可以通过 cron 每 5 分钟在您的服务器上运行数据处理来更新 Memcache 和禁止用户列表。这将关注点分开,并且从安全角度来看通常更好。我做了和你一样的事情,我的方法完美无缺:)
        猜你喜欢
        • 2012-02-21
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        相关资源
        最近更新 更多