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

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

    任何帮助将不胜感激。

    提前致谢

    维纳亚克

有帮助吗?

解决方案

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


(来源: epsi.pl

说明调用顺序的序列图:


(来源: epsi.pl

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

其他提示

不知道你的问题的细节,但Zend框架有一个相当强大的 ACL AUTH 组件可能想看看。好的东西,如非常精确的访问控制,存储持久性数据,高级条件规则。

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top