我们有一个内置的管理面板codeigniter,其中两种类型的用户登录(管理员和超级管理员)。管理员权限由超级管理员控制。管理员权限在登录时存储在会话中。我们使用codeigniter redis库来存储会话数据。
现在,挑战是在超级管理员更改权限时更新管理员用户会话数据而不影响管理员登录。

最佳答案

如果你想在运行时这么做,我想用redis应该不会有什么问题。
创建一个pre-controller钩子,如果用户会话已更改,则在其中检查每个请求
既然你使用redis,你真的不需要使用db查询来检查它,只需创建一个对象来保存会话已经更改的所有更改过的用户,并将其保存到redis
钩子看起来像

class AppRefreshSession
{
    private $ci;

    public function __construct()
    {
        $this->ci = get_instance();
    }

    public function initialize()
    {
        if (!$this->isSessionValid())
        {
            //refresh users Session
        }
    }

    private function isSessionValid()
    {
        $obj = $this->ci->cache->redis->get("ModifiedSessions_Object");

        if ($obj->hasSessionModified())
        {
            return false;
        }

        return true;


    }
}

当超级管理员更改权限时,修改后的sessions对象应该填充用户id或类似的内容。
把这个对象保存到redis中,就可以满足您的需要了。

09-25 18:11
查看更多