3

我使用一些 PHP 逻辑控制对我的一些静态 Web 资源的访问。因为通过网络服务器的基于目录的授权不适合或不容易实现。

事物的组合决定了访问是被授予还是被拒绝。而且这些规则会不时改变。

一开始它是一个简单的正则表达式路径匹配,以及一个会话变量的检查。现在更复杂了,因为涉及到更多变量。

我想知道如何进行重构,以便快速轻松地更改规则。当它是一个简单的“如果这个和这个,然后交付,否则 403”。直接用 PHP 就可以了。现在条件更加复杂,并且有几个嵌套级别,每个嵌套都有共同但略有不同的条件。这一切都很容易重构,但它不是最直观和最容易更新的。

我在想两件事之一。

  1. 为每个顶级条件建立类,并使用策略工厂来选择正确的授权。从包含公共位的基类中派生它们,并重载任何必要的东西。我认为当某些条件发生变化时,这仍然容易出现一些混乱。

  2. 制作一个简单的引擎来迭代一个 2d 有序规则数组,类似于防火墙规则。就像是:<allow|deny>, <auth_group>, <path_regex>, <other vars>

我还没有完全考虑过这一点,但它似乎更容易更新,也更容易作为人类阅读。

你会怎么做?我可以为此使用已建立的模式或库吗?

前段时间我在另一个应用程序中遇到了类似的问题。我想要一种基于多个条件级别将规则和结果链接在一起的简单更新方式。这并不像那个应用程序那么复杂,但我很想听听人们用来解决这类问题的模式。

4

3 回答 3

1

您可能想查看Zend_Acl,它是一个面向对象的 PHP 类,用于管理资源层次结构的权限层次结构。您可能无法按原样使用此组件,但它可以让您深入了解如何实现自己的系统。

Zend_Acl 是 Zend Framework PHP 5 类库的一部分,但与 ZF 中的许多类一样,Zend_Acl 可以独立使用。无需使用 Zend Framework 的其余部分。

于 2008-11-07T00:12:29.510 回答
0

您还可以使用小型逻辑引擎(想想 prolog)来轻松陈述事实和规则,这将允许您快速查询是否应该允许访问资源。像这样的基于逻辑的规则引擎通常非常有效,并且应该允许您非常轻松地为此类问题域建模解决方案。

于 2008-11-07T00:12:25.097 回答
0

我会使用规范模式。它允许您组合规则。您甚至可以创建一个类来表示将在IsSatisfiedBy()方法中运行(遵循模式)的复合规则。

于 2012-05-08T18:03:17.093 回答