2012-05-10 32 views
0

使用CakePHP 2.0的ACL我創建了2個組。一個是管理員,一個是訪問者。現在管理員可以添加和上傳圖片,訪問者可以查看圖片,如果他們點擊添加或刪除,它不會讓他們做任何事情。爲訪客羣組移除這些鏈接的最佳方法是什麼?如果我使用if/else語句來檢查它們屬於哪個組,那是否是最好的解決方案?CakePHP ACL爲不同的組生成不同的鏈接

回答

1

要隱藏導致用戶無權執行的操作的鏈接,視圖必須以某種方式知道用戶權限。 您可以通過檢查用戶所屬的組來檢查這些權限,但這意味着您不再依賴ACL權限。因此,任何ACL權限更新都必須在代碼中報告。不太方便。

那還有什麼?一種方法是在控制器中檢查用戶權限(通常在登錄時),然後在會話中保留這些權限。 然後可以在視圖中檢查會話中的權限以隱藏或顯示視圖的某些部分。你可以找到這種方法的一個例子:here

但是對於特定的鏈接,你可以走得更遠,避免寫視圖中的測試。我personnaly使用從HtmlHelper繼承並重寫link()方法的助手。 基本上它的工作原理是相同的:在override的link()方法中,檢查目標操作的權限並且幫助程序返回鏈接,或者如果用戶不被允許訪問目標操作,則返回任何內容。

如果您想嘗試一下我的代碼,你可以用我的Acl plugin

在你的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檢查與組件高度耦合。

+0

如果我有很多控制器(大約100個),它會影響性能嗎?每個控制器有5個或更多的方法? – Saanch

+2

@gvLearner正如我所說,它會影響登錄時間,因爲只要用戶通過身份驗證,就會檢查權限。在你的情況下,AclComponent-> check()方法在登錄時會被調用大約500次。這顯然是一個缺點。但是,一旦登錄完成,它幾乎不會影響性能(只有少數幾次調用「路由器」方法來比較操作鏈接和會話中的權限)。 – nIcO