【问题标题】:PHP Access Control SystemPHP门禁系统
【发布时间】:2010-09-18 17:23:55
【问题描述】:

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

  1. 控制特定 php 页面的用户权限,即根据用户角色提供或拒绝对特定页面(或用户界面元素)的访问。例如:用户可能被允许访问“学生”页面,但不能访问“教师”页面。
  2. 控制特定数据库记录的用户权限,即修改数据库查询以便仅显示特定记录。例如,对于城市级别的用户,应仅显示与用户的特定城市相关的记录,而对于国家级别的用户,应显示该国家/地区所有城市的记录。

我需要帮助设计一个可以处理这两种访问控制类型的系统。点号1似乎很简单。但是,我完全不知道如何在不对 SQL 查询中的信息进行硬编码的情况下执行第 2 点。

任何帮助将不胜感激。

提前致谢

维纳亚克

【问题讨论】:

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


    【解决方案1】:

    几个月前我也遇到过类似的情况。我发现如果您只检查单个项目的访问级别(或相当少的项目),像 Zend_ACL 之类的工具效果很好。当您需要获取允许用户访问的大量项目列表时,它会失败。我使用Business Delegate 模式为这个问题定制了解决方案。 BD 提供可以在特定上下文中应用的业务逻辑。在这种情况下,交付了一个 SQL 逻辑并将其用作子选择中的过滤条件。见下图:


    (来源:epsi.pl

    以及说明调用顺序的序列图:


    (来源:epsi.pl

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

    【讨论】:

    • 嗨,我知道这是一个旧答案,但我只需要澄清一下 UML class diagram ,不同类型的箭头是什么意思?,(实心、虚线和灰色)
    • @Triztian - 带箭头的实线表示方法调用,垂直虚线表示生命线,水平虚线通常表示返回
    【解决方案2】:

    不知道您的问题的详细信息,但 Zend 框架有一组相当强大的 ACLAUTH 组件,您可能想看看。好东西,例如非常精确的访问控制、持久存储数据、高级条件规则。

    【讨论】:

      【解决方案3】:

      在我看来,您需要的是这样的:(我将使用国家/州/城市示例)

      1. 所有国家的列表。每个“国家”都有一个 ID。
      2. 国家内所有国家的列表。每个州都与国家的 ID 绑定,但也有自己的唯一 ID。
      3. 所有城市的列表。每个城市都与一个州或一个国家直接绑定,并有一面旗帜表明哪个城市。

      对于城市用户,显然只搜索并显示与与其 ID 匹配的城市相关的记录。但是,对于州或国家级别,搜索与每个城市相关的所有记录,这些城市的 ID 与该国家(或州或您拥有的)相匹配。

      所以基本上,每个子组都依赖于它上面的组,虽然我没有记错,但我相信你可以从那里使用子查询来解决问题。

      【讨论】:

      • 嗨但这意味着搜索查询必须针对每个级别的用户进行不同的编写。我的问题是找到一种方法,使相同的查询根据用户的级别返回不同的结果集。
      • @vinayak.myopenid.com,如果您要让 SQL 服务器知道您拥有什么访问级别,无论如何您都必须使用不同的查询。似乎权限将通过在 WHERE 子句中使用 AND 附加表达式来处理。听起来很简单。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果您不知道如何执行此操作,我会使用 Zend Framework、CakePHP 或 Symfony 等 php 框架。他们已经为您完成了繁重的工作,并且已经制定了某种类型的访问控制方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-31
          • 1970-01-01
          相关资源
          最近更新 更多