最初の質問
簡単なACLをMVCに実装する方法を教えてください。
コントローラでAclを使用する最初の方法は次のとおりです...
<?php
class MyController extends Controller {
public function myMethod() {
//It is just abstract code
$acl = new Acl();
$acl->setController('MyController');
$acl->setMethod('myMethod');
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
これは非常に悪いアプローチであり、マイナスなのは、Aclコードを各コントローラーのメソッドに追加する必要があることですが、追加の依存関係は必要ありません。
次のアプローチは、すべてのコントローラーのメソッドを作成し、コントローラーのメソッドprivate
にACLコードを追加する__call
ことです。
<?php
class MyController extends Controller {
private function myMethod() {
...
}
public function __call($name, $params) {
//It is just abstract code
$acl = new Acl();
$acl->setController(__CLASS__);
$acl->setMethod($name);
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
以前のコードよりも優れていますが、主なマイナス点は...
- すべてのコントローラーのメソッドはプライベートである必要があります
- 各コントローラーの__callメソッドにACLコードを追加する必要があります。
次のアプローチは、Aclコードを親コントローラーに配置することですが、すべての子コントローラーのメソッドをプライベートに保つ必要があります。
解決策は何ですか?そして、ベストプラクティスは何ですか?メソッドの実行を許可または禁止するために、Acl関数をどこで呼び出す必要がありますか。
二番目の質問
2番目の質問は、Aclを使用して役割を取得することです。ゲスト、ユーザー、ユーザーの友達がいるとします。ユーザーは自分のプロファイルの表示へのアクセスを制限されており、友達だけが表示できます。すべてのゲストはこのユーザーのプロフィールを表示できません。それで、これが論理です。
- 呼び出されるメソッドがプロファイルであることを確認する必要があります
- このプロファイルの所有者を検出する必要があります
- ビューアがこのプロファイルの所有者であるかどうかを検出する必要があります
- このプロファイルに関する制限ルールを読む必要があります
- プロファイルメソッドを実行するかしないかを決定する必要があります
主な質問は、プロファイルの所有者を検出することです。モデルのメソッド$ model-> getOwner()のみを実行するプロファイルの所有者を検出できますが、Aclはモデルにアクセスできません。これをどのように実装できますか?
私の考えが明確であることを願っています。私の英語でごめんなさい。
ありがとうございました。
if($user->hasFriend($other_user) || $other_user->profileIsPublic()) $other_user->renderProfile()
(そうでないと、ディスプレイはそのようなか何か「あなたはこのユーザーのプロフィールへのアクセスを持っていない」私はそれを得ることはありません?。