设计一个相当复杂的网站,在一个页面上运行大量的ajax。我已达到某些用户需要具有特定权限才能执行操作的点,并且某些用户需要从操作中停止。我在我的数据库中设置了用户角色并且一切正常,但我想知道是否有更简单/更安全的方法来存储每个权限。
目前,当用户登录其特定权限时,会从数据库中获取并加载到会话数组中。要检查用户是否具有权限,我只需检查数组中是否包含权限。这似乎很迟钝,几乎就像我错过了一个更好的解决方案。
此外,用户显然可以编辑会话......是否有更安全的方法?
我原以为每次检查运行查询,但这可能会大大增加简单的ajax请求的加载时间。
我对任何想法都持开放态度。感谢。
答案 0 :(得分:21)
首先,用户无法编辑Session变量。用户计算机上唯一保存的是会话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
如果你愿意,可以使用它,但这是你的武器库中的一个很好的技巧。
答案 1 :(得分:1)
似乎对我好!您可以查看一些软件以增强会话密码性能。
每次查询数据库并不像听起来那么糟糕!首先,您可能需要连接到数据库,其次,如果您在登录时查询用户权限,则可能是所有相关行都位于缓冲区中且不需要IO,第三个是查询单个权限。对于用户的所有权限,单个用户将比查询轻得多。
答案 2 :(得分:-2)
你对模型的解释似乎有点困惑。权限是主题授权和对象授权的产物。您是否真的将这些产品存储在主题和对象的每个组合中?这是一个非常低效的解决方案,很难管理。
此外,会议显然可以由用户编辑
WTF ????? !!!!
会话数据只能通过您在代码中定义的方法进行更改 - 如果用户能够以他们喜欢的任何方式修改会话数据的任何部分,那么这是您需要解决的第一个问题 - 直到您执行此操作除非您将身份验证完全移出应用程序代码域,否则几乎不可能依赖身份验证/授权方法的任何部分(顺便说一句:这不是解决问题的正确方法)。
当然搜索一个非常大的数组(不确定实际的断点 - 但是在n = 1000的区域 - 但是有很多变量影响这个)可能比从数据库中获取结果要慢得多。
如果不了解当前系统的工作原理,很难说出你做错了什么。是one of these吗?