首先,用户不能编辑会话变量。唯一保存在用户机器上的是会话 ID。然后服务器使用该 ID 来获取仅存储在服务器上的键/值对。从客户的角度来看,不可能随心所欲地改变价值观。
其次,我不会太担心数据库连接。避免重复自己,但不要太担心第一次连接。
最后,我最喜欢在不创建角色的情况下执行多个权限的方法是使用二进制数学。有些人喜欢,有些人不喜欢,但我觉得它很有用。
要使用这种方法,我们定义以下值的成像:
CAN_EDIT_SOMETHING = 1 // Powers of 2
CAN_SEE_SOMETHING_ELSE = 2
CAN_DO_ADMIN_STUFF = 4
... = 8
要给人们多个权限,请使用二进制 OR
PERMISSIONS = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF
为了说明这是如何工作的,我们可以看一下这些位:
0b0001
OR 0b0100
---------
0b0101
要检查某人是否有权限,请使用二进制 AND
if( PERMISSIONS & CAN_EDIT_SOMETHING != 0 ) {
}
为了了解这是如何工作的,我们再次查看这些位
0b0101
AND 0b0001
----------
0b0001 // Not equal to 0. They must have that permission!
这种方法的最后一个好处是它允许您轻松地将多个权限组合成“元权限”
// If both EDIT_SOMETHING and ADMIN_STUFF are tasks that an admin
// can perform, we can combine them easily
//
IS_FULL_ADMIN = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF
// We can then use this value exactly as we do any other permission
//
PERMISSIONS = IS_FULL_ADMIN | CAN_SEE_SOMETHING ELSE
如果您愿意,可以使用它,但这是您的武器库中的一个不错的技巧。