2008-10-21 108 views
4

我正在研究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自己只有

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

感谢您的回复。

回答

5

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

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

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

另一张表为每个用户提供一个或多个“用户类型”或“组”,例如admin,未注册,主持人等。

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

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

-Adam

1

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

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

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

userPermission

  • userPermissionId
  • 用户id(FK)
  • TYPEID(FK)
  • hasEdit(布尔值)
  • hasView
  • 等。

要确定他们是否有编辑权限,请检查他们是否是所有者,或者在userPermission表中查找该项目类型和当前用户,然后选中hasEdit。您可以制定其他规则,例如在用户表中放置全局hasEdit。或代表在userPermissionId用NULL TYPEID条目全球hasEdit。

这可以通过使用角色和可变数量的权限来获得更复杂的方式..这一切都取决于您的要求。你需要仔细地指出你的业务需求(提出一堆用例),然后你可以从那里设计。事实上,没有足够的信息可以比我在这里概述的更多(甚至这可能不是你所需要的)。

0

我喜欢用一种防火墙规则的方式或类似的一个MySQL表规则的方法:你可以授予用户或用户组对特定对象或对象组的某些权利。使每个规则成为规则表中的一行。当您需要执行类似编辑的操作时,可以在规则表上为当前用户,当前用户的组,布尔编辑列和对象标识或对象组进行内部连接。如果你得到任何行当年被授予了权限。

0

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

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

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

相关问题