8

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

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

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

任何帮助,将不胜感激。

提前致谢

维纳亚克

4

5 回答 5

12

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

替代文字
(来源:epsi.pl

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

替代文字
(来源:epsi.pl

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

于 2008-11-28T13:50:08.617 回答
1

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

于 2008-10-23T06:07:22.993 回答
1

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

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

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

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

于 2008-10-23T06:10:37.963 回答
0

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

于 2008-10-23T18:36:07.507 回答
0

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

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

于 2011-01-24T06:27:27.797 回答