存储用户权限的最佳方式?

Cap*_*tis 9 php ajax user-roles

设计一个相当复杂的站点,在单个页面上运行大量的ajax.我已达到某些用户需要具有特定权限才能执行操作的点,并且某些用户需要从操作中停止.我在我的数据库中设置了用户角色并且一切正常,但我想知道是否有更简单/更安全的方法来存储每个权限.

目前,当用户登录其特定权限时,会从数据库中获取并加载到会话数组中.要检查用户是否具有权限,我只需检查数组中是否包含权限.这似乎很迟钝,几乎就像我错过了一个更好的解决方案.

此外,用户显然可以编辑会话......是否有更安全的方法?

我曾经想过为每个检查运行查询,但这可能会大大增加简单的ajax请求的加载时间.

我对所有想法持开放态度.谢谢.

riw*_*alk 23

首先,用户无法编辑Session变量.用户计算机上唯一保存的是会话ID.然后,服务器使用该ID来获取仅存储在服务器上的键/值对.从客户的角度来看,不可能随心所欲地改变价值观.

其次,我不会太担心数据库连接.避免重复自己,但不要过多担心第一次连接.

最后,我最喜欢在不创建角色的情况下执行多个权限的方法是使用二进制数学.有些人喜欢这样,有些人没有,但我发现它很有用.

要使用此方法,我们定义以下值的成像:

CAN_EDIT_SOMETHING        = 1     // Powers of 2
CAN_SEE_SOMETHING_ELSE    = 2
CAN_DO_ADMIN_STUFF        = 4
...                       = 8
Run Code Online (Sandbox Code Playgroud)

要为人们提供多个权限,请使用二进制OR

PERMISSIONS = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF
Run Code Online (Sandbox Code Playgroud)

为了说明这是如何工作的,我们可以看看这些位:

   0b0001
OR 0b0100
---------
   0b0101
Run Code Online (Sandbox Code Playgroud)

要检查某人是否拥有权限,请使用二进制AND

if( PERMISSIONS & CAN_EDIT_SOMETHING != 0 ) {
}
Run Code Online (Sandbox Code Playgroud)

为了了解其工作原理,我们再次查看这些内容

    0b0101
AND 0b0001
----------
    0b0001  // Not equal to 0. They must have that permission!
Run Code Online (Sandbox Code Playgroud)

这种方法的最终好处是它允许您轻松地将多个权限组合成"元权限"

// 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
Run Code Online (Sandbox Code Playgroud)

如果你愿意,可以使用它,但这是一个很好的技巧,你的武器库.