CakePHP 2.0 の ACL を使用して、2 つのグループを作成しました。1 つは管理者で、もう 1 つは訪問者です。現在、管理者は画像を追加およびアップロードでき、訪問者は画像を表示するだけで、追加または削除をクリックしても何もできません。訪問者グループのこれらのリンクを削除する最善の方法は何ですか? if/else ステートメントを使用して、どのグループに属しているかを確認する場合、それが最善の解決策でしょうか?
1 に答える
ユーザーが実行を許可されていないアクションにつながるリンクを非表示にするには、ビューが何らかの方法でユーザーのアクセス許可を認識している必要があります。ユーザーが属するグループを確認することでこれらのアクセス許可を確認できますが、これは、ACL アクセス許可に依存しなくなることを意味します。そのため、ACL 権限の更新はコードで報告する必要があります。あまり便利ではありません。
他に、次に何を ?アプローチは、通常はログイン中にコントローラーでユーザーのアクセス許可を確認し、これらのアクセス許可をセッションに保持することです。ビューの一部を表示または非表示にするために、セッションの権限をビューでチェックできます。この方法の例は、次の場所にあります。
しかし、特にリンクの場合は、もう少し先に進んで、ビューにテストを記述しないようにすることができます。私は、HtmlHelper から継承し、link() メソッドをオーバーライドするヘルパーを個人的に使用しています。基本的には同じ考え方で動作します: オーバーライドされた link() メソッド内で、ターゲット アクションのアクセス許可がチェックされ、ヘルパーがリンクを返すか、ユーザーがターゲット アクションへのアクセスを許可されていない場合は何も返しません。
私のコードを試してみたい場合は、私のACL プラグインを使用できます
AppController で、アクセス許可を設定します。
var $components = array(..., 'Acl.AclManager');
function beforeFilter()
{
...
//you can put it here as the permissions check is performed only once per session
$this->AclManager->set_session_permissions();
...
}
ビューでは、AclHtmlHelper を使用します。
$this->AclHtml->link(...);
ただし、この方法が基づいている原則に関する一般的な注意点は、ログイン中にすべての権限がチェックされることです。アプリケーションに多くのアクションがある場合、ログインが大幅に遅くなる可能性があります。
より効果的なアプローチは、必要な場合、つまり link() メソッドが呼び出された場合にのみ、各アクションのユーザー許可を確認することです。しかし、これはヘルパーが Acl パーミッション自体をチェックする必要があることを意味し、これは何らかの形で MVC モデルを壊します。また、コア ライブラリでは、Acl チェックはコンポーネントに高度に結合されています。