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


Access control for multiple users in a web application

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

有人对此有什么建议吗(表格结构等)?


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

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

并通过全局访问或仅自身(自己创建的帐户或记录)进行划分。

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

  • acl_uid
  • mod_id(fk模块uid)
  • target_id(fk用户uid或角色uid)
  • acl_type(用于标识目标id引用的用户/角色)
  • acl_read
  • acl_update
  • acl_创建
  • acl_delete

acl_read、acl_update、acl_create、acl_delete值范围:

  • 0拒绝
  • 1允许
  • 2表示优先级较低的检查(如果用户的值为2,则表示角色)
  • 3仅限自己

我相信有更有效的方法来解决这个问题,或者可能对我目前的方法有所改进。

感谢您的回复。

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

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

另一个表格描述了每种类型的内容是如何显示的(在首页、单个博客页面等)。

另一个表为每个用户提供了一个或多个"用户类型"或"组",如管理员、未注册、主持人等。

最后一个表是一个访问表,它显示了每个组有权做什么,包括它可以创建、编辑、发布等内容的类型。

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

-Adam

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

考虑到你的直接需求,它可能相当简单。在用户表中,有一个hasEdit、hasView等。对于每个项目,在其上附加一个代表创建者的userid。在业务层中,如果他们是创建者,则规则是他们具有编辑权限,或者他们具有hasEdit=true。

更进一步,如果您有不同的类型,并且每个类型的hasEdit权限为,则需要另一个实体。

userPermission

  • userPermissionId
  • userId(FK)
  • typeId(FK)
  • hasEdit(布尔值)
  • hasView
  • 等等

要了解他们是否有编辑权限,请检查他们是否是所有者,或者在userPermission表中查找该项目类型和当前用户,然后选中hasEdit。您可以制定其他规则,比如在用户表中放入全局hasEdit。或者通过userPermissionId中类型ID为NULL的条目来表示全局hasEdit。

使用角色和可变数量的权限,这可能会变得更加复杂。。这一切都取决于你的要求。你需要仔细地规范你的业务需求(提出一堆用例),然后你就可以从那里进行设计了。事实上,我在这里概述的信息真的不够多了(甚至这可能也不是你所需要的)。

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

设计安全性的方法有很多,我喜欢针对不同情况的方法。还有其他UNIX风格的用户组。我碰巧喜欢PmWiki的安全模型。

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

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