我使用一些PHP逻辑控制对某些静态Web资源的访问。因为通过网络服务器进行基于目录的授权不合适或不太可能。
事物的组合决定了是授予还是拒绝访问。这些规则会不时发生变化。
在开始时,它是一个简单的正则表达式路径匹配,并检查一个会话变量。现在它变得更复杂,因为还涉及更多变量。
我想知道如何进行重构,以便快速轻松地更改规则。当它是一个简单的“如果这个和这个,那么交付,否则403。”用PHP直接做这件事很好。现在条件更复杂,并且有几个级别的嵌套,每个嵌套都有共同但略有不同的条件。这很容易重构,但它不是最直观,最容易更新的。
我正在考虑两件事之一。
为每个顶级条件建立类,并使用策略工厂选择正确的授权。从包含公共位的基类派生它们,并在必要时重载。我认为当某些条件发生变化时,这仍然可能会出现一些改变。
创建一个简单的引擎,迭代二维有序规则数组,类似于防火墙规则。例如:<allow|deny>, <auth_group>, <path_regex>, <other vars>
我还没有完全想到这一点,但似乎更容易更新,也可以作为人类阅读。
你会做什么?我可以使用已建立的模式或库吗?前一段时间我在另一个应用程序中遇到了类似的问题。我希望根据几个条件级别一起更新链接规则和结果的方法。这并不像那个应用程序那么复杂,但我很想知道人们用来解决这类问题的模式。
答案 0 :(得分:1)
您可能需要查看Zend_Acl,这是一个面向对象的PHP类,用于管理资源层次结构的特权层次结构。您可能无法按原样使用此组件,但它可以让您深入了解如何实现自己的系统。
Zend_Acl是Zend Framework PHP 5类库的一部分,但与ZF中的许多类一样,Zend_Acl可以独立使用。没有必要使用Zend Framework的其余部分。
答案 1 :(得分:0)
您还可以使用一个小型逻辑引擎(思考prolog)轻松陈述事实和规则,以便您可以快速查询是否允许访问资源。像这样的基于逻辑的规则引擎通常非常有效,并且应该允许您非常轻松地为这种问题域建模解决方案。
答案 2 :(得分:0)
我会使用Specification Pattern。它允许您组合规则。您甚至可以创建一个类来表示将在IsSatisfiedBy()
方法中运行(在模式之后)的复合规则。