2012-05-10 4 views
0

CakePHP 2.0のACLを使用して2つのグループが作成されました。 1人は管理者で、1人は訪問者です。管理者は画像を追加してアップロードすることができ、訪問者は画像を見ることができます。追加または削除をクリックすると、画像を表示できます。ビジターグループのリンクを削除するにはどうすればよいですか? if/else文を使用して、どのグループに属しているかを確認すると、それが最善の解決策になりますか?CakePHP ACLによって異なるグループに異なるリンクが生成される

答えて

1

ユーザーが実行する権限を与えられていない操作につながるリンクを非表示にするには、ビューは何らかの形でユーザーのアクセス許可を認識する必要があります。 ユーザーが所属するグループをチェックすることで、これらのアクセス許可を確認できますが、これはもはやACL許可に依存しないことを意味します。そのため、ACL権限の更新はすべてコードで報告する必要があります。それほど便利ではありません。

他に何がありますか?アプローチは、通常はログイン時にコントローラのユーザー権限を確認し、セッションでこれらのアクセス許可を保持することです。 セッションのアクセス権をビューで確認して、ビューの一部を表示または非表示にすることができます。このメソッドの例を見つけることができますhere

しかし、具体的には、リンクをさらに詳しく調べて、ビューにテストを書くことは避けてください。私はHtmlHelperから継承したhelperを使い、link()メソッドをオーバーライドします。 基本的には、同じ考え方で動作します。オーバーライドされたlink()メソッド内では、ターゲットアクションに対するアクセス権がチェックされ、ヘルパーによってリンクが返されます。あなたは私のコードを試してみたい場合は

、あなたのAppControllerでは私のAcl plugin

を使用することができ、権限設定:

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モデルを壊すでしょう。コアlibでは、Aclチェックはコンポーネントに強く結合されています。

+0

多くのコントローラー(約100個)を持っていて、各コントローラーに5つ以上のメソッドがある場合、パフォーマンスに影響しますか? – Saanch

+2

@gvLearner私が言及したように、ユーザが認証されるとすぐに許可がチェックされるので、ログイン時間に影響します。あなたの場合、AclComponent-> check()メソッドはログイン時に約500回呼び出されます。これは明らかに欠点です。しかし、ログインが完了すると、ほとんどの場合パフォーマンスに影響を与えません(セッション内のアクションリンクとアクセス権を比較するために、いくつかの 'Router'メソッドへのいくつかの呼び出しだけが使用されます)。 – nIcO

関連する問題