Web应用程序中多个用户的访问控制
我正在研究PHP + MySQL社交网络应用程序,现在我需要为全局(所有项目)和/或全局项目设置不同的访问控制(读取,创建,编辑,删除)或自己的项目(自己创建的项目)为每个模块分组或特定用户。Web应用程序中多个用户的访问控制
有没有人有这样做的建议(表结构等)?
还好这里我提供更多的细节,目前我有一个tbl_module,tbl_user和tbl_user_role。每个用户和角色可以对特定模块有不同的访问权限。
- 阅读
- 更新
- 创建
- 删除
和全局访问或自止(自行创建自己的账户或记录)devided。
和我目前的做法:我创建另一个表来保存访问细节:
- acl_uid
- mod_id(FK模块UID)
- target_id(FK用户uid或角色UID)
- acl_type(标识目标id参考的用户/角色)
- acl_read
- acl_update
- acl_create
- acl_delete
acl_read,acl_update,acl_create,acl_delete值范围:
- 0否认
- 1允许
- 2指较低优先级检查(如果用户具有值2然后参考角色)
- 3自己只有
我相信,更有效的方法来解决这个问题,或者可能改善我目前的做法。
感谢您的回复。
这实际上是一个非常广泛的问题。假设你有明确的应用层分离(例如,使用MVC),那么这就是业务层中的一些东西。
考虑到您的直接需求,它可能相当简单。在你的用户表中,有一个hasEdit,hasView等。对于每个项目,附加一个用户标识符表示创建者。在业务层中,规则是如果他们是创建者,则他们具有编辑权限,或者他们拥有hasEdit = true。
如果您有不同的类型,并且每个类型的的hasEdit权限为,那么您需要另一个实体。
userPermission
- userPermissionId
- 用户id(FK)
- TYPEID(FK)
- hasEdit(布尔值)
- hasView
- 等。
要确定他们是否有编辑权限,请检查他们是否是所有者,或者在userPermission表中查找该项目类型和当前用户,然后选中hasEdit。您可以制定其他规则,例如在用户表中放置全局hasEdit。或代表在userPermissionId用NULL TYPEID条目全球hasEdit。
这可以通过使用角色和可变数量的权限来获得更复杂的方式..这一切都取决于您的要求。你需要仔细地指出你的业务需求(提出一堆用例),然后你可以从那里设计。事实上,没有足够的信息可以比我在这里概述的更多(甚至这可能不是你所需要的)。
我喜欢用一种防火墙规则的方式或类似的一个MySQL表规则的方法:你可以授予用户或用户组对特定对象或对象组的某些权利。使每个规则成为规则表中的一行。当您需要执行类似编辑的操作时,可以在规则表上为当前用户,当前用户的组,布尔编辑列和对象标识或对象组进行内部连接。如果你得到任何行当年被授予了权限。
设计安全性的方法有很多种,我在不同的情况下都喜欢不少。有UNIX风格的用户组 - 其他。我碰巧喜欢PmWiki's security model。
我开发了一个网站,该网站采用了类似于Apache用户角色权限结构。在那个网站上,我使用了一个模板系统,它使用了一个头文件包含文件和一个页脚包含文件,用“标准东西”来包装页面内容。具有受限内容的页面可以将变量设置为所需的权限,即头文件脚本查找的内容,如果设置了,则调用auth函数来检查用户是否属于某个角色的权限。
使用用户角色权限模型的好处在于,如果大多数用户都属于纯粹的授权类别,那么为用户设置授权只需向该用户添加正确角色即可。权限与角色关联,而不是直接与用户关联,因此您可以轻松调整整个用户类的权限。