Web应用程序中多个用户的访问控制

时间:2008-10-21 00:38:59

标签: php mysql database

我正在开发一个PHP + MySQL社交网络应用程序,现在我需要为全局(所有项目)和/或自我项目(自己创建的项目)设置不同的访问控制(读取,创建,编辑,删除) )为每个模块分组或特定用户。

有没有人有这样做的建议(表格结构等)?


好的,我在这里提供更多细节,目前我有一个tbl_module,tbl_user和tbl_user_role。每个用户和角色可以对特定模块具有不同的访问权限。

  • 阅读
  • 更新
  • 创建
  • 删除

并且仅限全球访问或仅限自己(自己创建的帐户或记录)。

和我目前的方法:我创建另一个表来保存访问细节:

  • acl_uid
  • mod_id(fk module 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 self only

我相信这是解决这个问题的更有效方法,或者可能是我现有方法的改进。

感谢您的回复。

4 个答案:

答案 0 :(得分:5)

这是一个非常广泛的问题,所以你很可能只得到非常广泛的答案。

大多数CMS系统都有一个表格,列出了可以在系统上生成的内容类型。

另一个表格描述了每种类型的内容的显示方式(在首页,各个博客页面等)。

另一个表为每个用户提供一个或多个“用户类型”或“组”,例如admin,unregistered,moderator等。

最后一张表是各种各样的访问表 - 它显示了每个组有权做的事情,包括它可以创建,编辑,发布等的内容类型。

我建议您花一点时间研究其他CMS软件的数据库模式,例如SlashcodeDrupal或其他数百万个CMS系统之一。

- 亚当

答案 1 :(得分:1)

这实际上是一个非常广泛的问题。假设您清楚地分离了应用程序层(例如,使用MVC),那么这就是业务层中的那种东西。

根据您的直接要求,它可能相当简单。在您的users表中,有一个hasEdit,hasView等。对于每个项目,将一个userid附加到它代表创建者。在业务层中,规则是如果它们是创建者,则它们具有编辑权限,或者它们具有hasEdit = true。

提升一个档次,如果你有不同的类型,并且hasEdit权限是 per-type ,你需要另一个实体。

<强> userPermission

  • userPermissionId
  • userId(FK)
  • typeId(FK)
  • hasEdit(boolean)
  • hasView
  • 等..

要确定他们是否有编辑权限,您可以检查他们是否是所有者,或者在userPermission表中查找该项类型和当前用户,并检查hasEdit。您可以制作其他规则,例如在用户表中放置全局hasEdit。或者通过userPermissionId中的条目使用NULL typeId表示全局hasEdit。

使用角色和可变数量的权限可能会变得更加复杂..这一切都归结为您的要求。您需要仔细规定您的业务需求(提出一堆用例),然后您可以从那里进行设计。事实上,我所提出的信息确实不足以提出(甚至这可能不是你所需要的)。

答案 2 :(得分:0)

我喜欢使用一种防火墙规则方法或类似的mysql表规则方法:您可以授予用户或用户组对某些对象或对象组的某些权限。使每个规则成为规则表中的一行。当您需要执行诸如编辑之类的操作时,您可以在规则表上内联接当前用户,当前用户的组,布尔编辑列以及对象ID或对象组。如果您返回任何行,则授予该权限。

答案 3 :(得分:0)

有很多设计安全性的方法,我喜欢不同的情况。有UNIX风格的用户组 - 其他。我碰巧喜欢PmWiki's security model

我开发了一个使用类似于Apache的用户角色权限结构的网站。通过该网站,我使用了一个模板系统,该系统使用标题包含文件和页脚包含文件来使用“标准内容”包装页面内容。内容受限的页面可以将变量设置为标题脚本查找所需的权限,如果设置,则调用auth函数来检查用户是否属于该权限的角色。

使用用户角色权限模型的好处是,如果您的大多数用户属于整齐的授权类别,则为用户设置授权只需向该用户添加正确的角色即可。权限链接到角色,而不是直接链接到用户,因此您可以轻松调整整个用户类的权限。