PHP访问控制系统

时间:2008-10-23 05:52:20

标签: php database-design permissions access-control database-permissions

我是使用PHP和MySQL创建Web应用程序的团队的一员。该应用程序将具有多个具有不同角色的用户。该应用程序还将以地理分布的方式使用。因此,我们需要创建一个在以下两个级别运行的访问控制系统:

  1. 控制特定php页面的用户权限,即根据用户的角色提供或拒绝对特定页面(或用户界面元素)的访问。例如:可以允许用户访问“学生”页面,但不能访问“教师”页面。
  2. 控制特定数据库记录的用户权限,即修改数据库查询,以便仅显示特定记录。例如,对于城市级别的用户,只应显示与用户特定城市相关的那些记录,而对于国家级别的用户,应显示该国家/地区中所有城市的记录。
  3. 我需要帮助设计一个可以处理这两种访问控制的系统。点号。 1似乎很简单。但是,如果不对SQL查询中的信息进行硬编码,我完全不知道如何做第2点。

    任何帮助将不胜感激。

    提前致谢

    维纳亚克

5 个答案:

答案 0 :(得分:12)

几个月前,我的情况类似。我发现像Zend_ACL这样的工具可以很好地检查单个项目的访问级别(或者相当低的数量)。当您需要获取允许用户访问的大量项目时,它会失败。我使用Business Delegate模式为这个问题制作了自定义解决方案。 BD提供可在特定上下文中应用的业务逻辑。在这种情况下,SQL逻辑已交付并用作subselect中的过滤条件。请参见下图:

alt text
(来源:epsi.pl

说明调用顺序的序列图:

alt text
(来源:epsi.pl

I blogged about this solution,不幸的是它都是波兰语,但你可能会发现一些代码和图表。我可以说,实现不是小菜一碟,但在性能方面,与列表中每个元素的迭代访问检查相比,它是一个冠军。此外,上面的基础结构不仅处理列表中的一种类型的项目。只要列表中的项目实现IAuthorizable界面,它就可以在访问不同列表时使用,无论是城市,国家/地区,产品或文档列表。

答案 1 :(得分:1)

不了解您的问题的详细信息,但Zend Framework有一个相当有效的ACLAUTH组件,您可能需要查看。好的东西,如非常精确的访问控制,存储持久性数据,高级条件规则。

答案 2 :(得分:1)

在我看来,你需要的是:(我将使用国家/州/城市的例子)

  1. 所有国家/地区的列表。每个“国家/地区”都有一个ID。
  2. 国家内所有国家的清单。每个州都绑定到coutnry的ID,但也有自己唯一的ID。
  3. 所有城市的列表。每个城市都是一个州或一个国家,并有一个标志来指示哪个。
  4. 对于城市用户,显然只搜索和显示与城市相关的那些与其ID相匹配的记录。但是,对于州或国家级别,搜索与每个城市相关的所有记录,其ID与该国家(或州或您拥有的)相匹配。

    所以基本上,每个子组依赖于它上面的组,虽然我没有记错,但我相信你可以使用子查询来完成这个技巧。

答案 3 :(得分:0)

如果你不知道怎么做,我会使用像Zend Framework,CakePHP或Symphony这样的php框架。他们为您完成了繁重的工作,并且已经实施了某种类型的访问控制方案。

答案 4 :(得分:0)

我有类似的构建解决方案,到目前为止我已经决定使用规范和角色,所以实际上一个角色会附加一些特权规范。如果他们都满意,则授予权限,否则 - 它将回退到资源默认访问权限。

我正在寻找已经实施解决方案的人,但似乎没有人这样做。让我们希望它不会失败:)