首先,用户不能编辑会话变量。唯一保存在用户机器上的是会话ID。该ID随后被服务器用于获取仅存储在服务器上的键/值对。从客户的角度来看,不可能随心所欲地改变价值观。
其次,我不会太担心数据库连接。避免重复自己,但不要太担心第一次连接。
最后,我最喜欢的做法是不使用角色创建多个权限,而是使用二进制数学。有些人喜欢这个,有些人不喜欢,但我觉得它很有用。
要使用此方法,成像,我们定义了以下值:
CAN_EDIT_SOMETHING = 1 // Powers of 2
CAN_SEE_SOMETHING_ELSE = 2
CAN_DO_ADMIN_STUFF = 4
... = 8
给人以多重权限,使用二进制或
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
如果你想使用它,但它是一个很好的技巧,在你的武库。
感谢您解释二进制文件,我想在第一次设计角色时使用类似的东西。我最终使用了2个包含用户角色和indv权限的db表,这对我来说更有意义。 我也可以发誓,我看到有些地方可以拉你的会议数据并编辑它,虽然很困难。也许不会。 – 2010-09-09 05:51:30
@Capt奥蒂斯,就像我说过,它在某些情况下,而不是在其他情况下。你比我更了解你的系统。至于会话,这是它如何在PHP中工作,但你应该检查你正在使用的系统。使用Fiddler或Wireshark来检查流量并查看您的用户实际看到的是什么。如果所有来回传递的都是一个ID(当值更改时不会改变),那么你很好。如果您注意到的值比ID更多,或者如果您注意到会话值更改时会话信息发生变化,那么您遇到了麻烦,并且您最好仔细查看会话:) – riwalk 2010-09-09 17:19:19