可扩展的基于规则的访问模式

时间:2008-11-06 23:51:50

标签: php design-patterns oop refactoring rule-engine

我使用一些PHP逻辑控制对某些静态Web资源的访问。因为通过网络服务器进行基于目录的授权不合适或不太可能。

事物的组合决定了是授予还是拒绝访问。这些规则会不时发生变化。

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

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

我正在考虑两件事之一。

  1. 为每个顶级条件建立类,并使用策略工厂选择正确的授权。从包含公共位的基类派生它们,并在必要时重载。我认为当某些条件发生变化时,这仍然可能会出现一些改变。

  2. 创建一个简单的引擎,迭代二维有序规则数组,类似于防火墙规则。例如:<allow|deny>, <auth_group>, <path_regex>, <other vars>

  3. 我还没有完全想到这一点,但似乎更容易更新,也可以作为人类阅读。

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

    前一段时间我在另一个应用程序中遇到了类似的问题。我希望根据几个条件级别一起更新链接规则和结果的方法。这并不像那个应用程序那么复杂,但我很想知道人们用来解决这类问题的模式。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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