3

静的WebリソースへのアクセスをPHPロジックで制御しています。Webサーバーを介したディレクトリベースの認証は適切ではないか、簡単に実行できないためです。

物事の組み合わせにより、アクセスを許可するか拒否するかが決まります。そして、これらのルールは時々変更されます。

最初は、単純な正規表現パスの一致と、1つのセッション変数のチェックでした。関係する変数がさらにいくつかあるため、現在はより複雑になっています。

ルールをすばやく簡単に変更できるように、これをリファクタリングする方法を考えています。それが単純だったとき「これとこれがあれば、それから配達し、そうでなければ403」。ストレートPHPでそれを行うのは問題ありませんでした。現在、条件はより複雑になっており、それぞれに共通しているがわずかに異なる条件が含まれる2つのレベルのネストがあります。これはすべてリファクタリングするのに十分簡単ですが、最も直感的で更新するのは簡単ではありません。

私は2つのことのうちの1つを考えています。

  1. トップレベルの条件ごとにクラスを確立し、ストラテジーファクトリーを使用して適切なものを選択します。共通ビットを含む基本クラスからそれらすべてを導出し、必要なものは何でもオーバーロードします。条件が変わると、これでもシャッフルが発生しやすいと思います。

  2. ファイアウォールルールのような順序付けられたルールの2次元配列を繰り返す単純なエンジンを作成します。何かのようなもの:<allow|deny>, <auth_group>, <path_regex>, <other vars>

これについては十分に考えていませんが、更新したり、人間として読んだりする方が簡単なようです。

あなたならどうしますか?これに使用できる確立されたパターンまたはライブラリはありますか?

私はしばらく前に別のアプリでこの同様の問題に直面しました。いくつかのレベルの条件に基づいて、ルールと結果を連鎖させる簡単な更新方法が必要な場合。これはそのアプリほど複雑ではありませんが、この種の問題を解決するために人々が使用するパターンについて聞いてみたいと思います。

4

3 に答える 3

1

リソースの階層に対する特権の階層を管理するためのオブジェクト指向のPHPクラスであるZend_Aclを確認することをお勧めします。このコンポーネントをそのまま使用することはできないかもしれませんが、独自のシステムをどのように実装したいかについての洞察を得ることができます。

Zend_AclはZendFrameworkPHP 5クラスライブラリの一部ですが、ZFの多くのクラスと同様に、Zend_Aclは独立して使用できます。ZendFrameworkの残りの部分を使用する必要はありません。

于 2008-11-07T00:12:29.510 に答える
0

また、小さなロジックエンジン(プロローグを考えてください)を使用して、リソースへのアクセスを許可するかどうかをすばやく照会できるようにする事実とルールを簡単に述べることもできます。このようなロジックベースのルールエンジンは、多くの場合非常に効率的であり、この種の問題ドメインのソリューションを非常に簡単にモデル化できるはずです。

于 2008-11-07T00:12:25.097 に答える
0

Specification Patternを使用します。ルールを組み合わせることができます。メソッドで (パターンに従って) 実行される複合ルールを表すクラスを作成することもできますIsSatisfiedBy()

于 2012-05-08T18:03:17.093 に答える