我正在制作一个基于CI 3.0.4的基于Web的管理面板应用程序。因此,如果用户以管理员身份登录,但如果超级用户同时将该用户从admin更改为普通用户,则应立即注销。
这里的问题是我在会话中存储数据,如果我不这样做,那么我每次都需要运行db查询,这将在应用程序上放置过多的数据库负载。
无论如何,我们可以在更改后立即注销用户会话或更新用户的会话值。如果我们能够更新那些,那么我的应用程序将检查并注销。
谷歌与gmail相同。如果您从多个设备登录,则可以注销其他设备实例。
请提出一些逻辑或最好的方法来处理这种情况。
答案 0 :(得分:1)
如果您需要操作当前存储在会话中的一段数据,那么它不应该首先存储在那里。
尝试阅读和/或更改其他用户的会话数据可能是最直接的想法,因为在会话本身内部存储“登录”标志会更容易。然而,这样做是错误的,并不像听起来那么容易。 会话数据旨在由一个用户和一个用户读取,并且由于PHP序列化会话数据的方式,忽略这一事实是不可能的。
与其他人的评论相反,将驱动程序更改为“数据库”也无济于事。这是序列化格式,这使得这很难,而不是存储。
实际的解决方案是以某种方式将sessionId <-> userId
关系存储在会话本身之外,以便稍后可以删除属于您刚刚修改过的权限的用户的所有会话。
事实上,关系数据库确实使这个变得微不足道,但你可以使用任何类型的存储。
答案 1 :(得分:-1)
对于这种情况,如果你没有接近完成你的项目ion auth是一个很好的解决方案。它有组选项,您可以在__constract函数中检查用户是否为admin。像这样的东西
public function __construct()
{
if (!$this->ion_auth->is_admin()) {$this->ion_auth->logout();die();}
parent::__construct();
$this->load->database();