我正在为包含多个部门的企业创建一个Web应用程序。我使用PHP和MySql来执行此操作,在我的数据库中,我将权限存储为ENUM,其中包括选项N(无访问权限),R(只读)和RW(读取和写入)。
用户登录后,php脚本会找到相应的权限并将其存储在会话中。例如:如果用户具有RW for Production,则会话变量$_SESSION['production'] = RW
。现在每当我需要查看是否允许用户编辑生产时,我都会检查会话变量并采取适当的措施。
我有20个这样的特权类别。这肯定不是存储这样的东西的方式。这将简单地增加加载时间并占用大量内存。是否有任何替代方法可以存储user rights
?
注意:预计20类别列表会增长。
答案 0 :(得分:2)
我通常使用
$_SESSION['privileges']=array(
'someprivilege' => 'r',
'someotherprivilege' => 'rw'
)
保持上下文中的内存要求:100个权限,由20个字符组成的名称,5个字符的值,将加起来小于一页(4k)。 PHP在会话文件上使用非常有效的bnary序列化程序,大大减轻了加载时间问题。
答案 1 :(得分:1)
为什么不在数据库中存储访问权限并在需要时通过用户ID检查它们? 您只需要在$ _SESSION中存储用户ID。 这简化了整个应用程序。
如果您在会话中存储访问权限,则需要始终确保它们始终在任何单一时间点都是最新的。例如,如果管理员想要更改用户访问权限,则需要具有将用户注销的额外功能。或者,例如,每次用户尝试访问页面时都需要更新$ _SESSION,这是开销,无论如何都需要每次都检查数据库。
答案 2 :(得分:1)
您可以创建一个标识所有用户信息的标识类(id,特权以及这些属性的getter),并在用户登录后通过使用用户ID获取DB的权限来实现它。
然后每当你需要找到他的权利时,只需调用getRights();来自你的身份等级。
答案 3 :(得分:0)
您应该只在申请时选择权限。这样可以将您的负载限制在所需的范围内。
或者,您可以按序列化形式存储每个用户的权限。然后这将是单个检索操作(而不是20或更多)。封装后面的逻辑,这样你就可以在数据库和会话中同样轻松地存储它,并轻松管理和存储它们。
除了这些一般性的建议之外,无论如何我都看不到你的问题。你需要做你需要做的事情。如果你想减少麻烦,你可以减少权限数量,但这显然不会像你想要的那样有用。
然后,会话的问题是什么?或者更具体地说,你的意思是什么?