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