设计一个相当复杂的网站,并在单个页面上运行许多Ajax。我已经达到了某些用户需要特定许可做事的地步,有些则需要停止操作。我已经在数据库中设置了用户角色,一切正常,但是我想知道是否有一种更轻松/更安全的方法可以存储每个权限。

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

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

我认为每次检查都需要查询,但这可能会大大增加简单的Ajax请求的负载时间。

我对所有想法都开放。谢谢。

有帮助吗?

解决方案

首先,用户无法编辑会话变量。在用户的计算机上保存的唯一一件事是会话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

要检查某人是否有许可,请使用二进制

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

如果需要,请使用它,但这是您的武器库中的一个不错的技巧。

其他提示

对我来说似乎还可以!您可以查看一些软件以增强您的会话chache peformance。

每次查询数据库的声音都不那么糟糕!首先,您可能需要无论如何都需要连接到数据库,其次,如果您在用户登录时查询许可证,那么可能会有所有相关行都坐在缓冲区中,而不需要IO,第三,第三,查询单一的许可。单个用户将比查询用户的所有许可要轻得多。

您对模型的解释似乎有些困惑。权限是主题授权和对象授权的产品。您是否真的将这些产品存储在主题和物体的每种组合中?这是一个非常低效的解决方案,很难管理。

此外,会议显然可以由用户编辑

wtf ????? !!!!

会话数据只能通过您在代码中定义的方法更改 - 如果用户能够以任何方式修改会话数据的任何部分,那么这是您需要解决的第一个问题 - 直到您这样做,它将除非您将身份验证完全移出应用程序代码的域(BTW:这不是解决问题的正确方法),否则几乎不可能依靠身份验证/授权方法的任何部分。

当然,搜索一个非常大的数组(不确定实际断点 - 但是在n = 1000的区域中 - 但是有很多变量影响此)要比从数据库中获取结果要慢得多。

如果不了解当前系统的工作方式,很难说出您在做什么错。是吗 其中之一?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top