2015-10-14 55 views
0

我一直在努力为我们公司开发内部员工门户。有部门,工作等级,工作区域,角色(用户,编辑者,管理员,超级管理员等)和特殊组(高级管理人员等)进行用户分组。像Facebook Sharings(灵活ACL)的高级定位数据库设计

用户必须有一个(只有一个)部门。 用户必须有一个(只有一个)工作成绩。 用户必须在至少一个区域工作。 用户必须有一个(只有一个)角色。 用户可能有一个或多个特殊组。

工作成绩和角色是分层的(一个等级或角色可能是另一个的继承),但其他的不是。

用户将只看到允许的菜单并访问允许的路线。

用户还将选择在发布新内容时哪些用户可以查看它。 例如: 组合1 :(IT或财务部门)和(工作级别是9,10,11之一)和(面积是1,5,8之一)和(独家特别小组是1.5, 8)除了用户ID = 1 组合2 :(人力资源部门)和(工作级别为11)和user_id = 3,4,5

组合可以像组合1和组合2那样相关为AND/OR

所以,会有很多内容,每个内容都会有不同的组权限。我尝试创建数据库模式,但很难获取用户登录时看到的所有内容。序列化的数据对于在db中保存组合集是很好的,但对于序列化的数据来说看起来是不可能的。在这个问题上使用MongoDB有没有好处?我怎样才能在表中保存组/用户权限的组合?

我研究了大量的ACL和RBAC示例,但找不到最佳解决方案。请帮忙。

顺便说一句,我使用Laravel框架。

谢谢。

+0

的可能的复制[复合右倾系统:ACL,RBAC多什么(http://stackoverflow.com/questions/13580702/complex-righty-system-acl-rbac-还有更多) –

回答

1

您需要查看基于属性的访问控制(ABAC - Wikipedia)和可扩展访问控制标记语言(XACML)。 NIST,美国国家科学院&技术在这里给出了一个很好的介绍ABAC

XACML将为您提供表达使用您属性的细粒度访问控制策略的能力。在你的问题,你有:

  • 用户属性
    • 部门
    • 职位专用
    • 工作区
    • 作用
  • 对象(资源)的属性
    • 内容类型
    • 内容位置
    • 内容分类

有了XACML可以编写规则,如:

与等级== 1,用户可以做动作==编辑内容类型==后 if content.department == user.department。

您可以拥有尽可能多的规则,包括冲突规则或环境规则(拒绝早上9点之前的访问)。

查看Eclipse的ALFA插件来编写自己的策略(Wikipedia | Download)。

HTH, 大卫

+0

非常感谢。不幸的是,没有任何PHP和MySQL实施ABAC。所以,我无法想象如何创建数据库模式和写查询。 :/ –

+0

看看PHP Slim和MySQL FGAC –