2011-06-06 41 views
0

我試圖在CakePHP身份驗證組件中使用角色。角色將是用戶,管理員,超級管理員等。我很難在每個控制器中放置一個基於用戶角色的條件。我嘗試了以下,但它沒有工作:CakePHP身份驗證組件中的角色

function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allow('add'); 

     if($this->Auth->user('roles') == 'admin') { 
      $this->Auth->allow('index', 'add', 'edit', 'delete'); 
     } 
     elseif($this->Auth->user('roles') == 'super-admin') { 
      $this->Auth->allow('index', 'add', 'edit', 'delete', 'make_super_admin', 'privileges'); //Note difference in superadmin priviledges 

     } 

問題是有條件的。我希望函數能夠進入每個控制器(UsersController,PatientsController,AdmissionsController等)並基於用戶角色,賦予不同的權限。

回答

0

我不知道這是不是你的問題,但如果你想允許每一個動作,你必須使用*而不是什麼:

function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow('add'); 

    if($this->Auth->user('roles') == 'admin') { 
     $this->Auth->allow('*'); 
    } elseif($this->Auth->user('roles') == 'super-admin') { 
     $this->Auth->allow('*'); 
    } 
} 

如果您要爲每個控制器的權限,它將它放在你的AppController中是最好的,所以它會影響一切。

+0

我原來在那裏,不知道爲什麼它現在不存在。但這並沒有回答這個問題。問題在於條件。我希望函數能夠進入每個控制器(UsersController,PatientsController,AdmissionsController等)並基於用戶角色,賦予不同的權限。 – Chris 2011-06-07 14:37:19

+0

如果每個控制器擁有不同的權限,則只能在每個控制器中手動設置它們,或者按照@generalopinion的建議使用ACL。 – Tim 2011-06-08 07:12:59

+0

@generalopinion儘管我很難理解如何做到這一點,但您已經說服了我。如果有人能夠推薦一個好的(不包括蛋糕的)教程或者寫出一個好的,我相信他們會得到很多掌聲。 – Chris 2011-06-09 21:14:35

1

將此邏輯放在AppController類的beforeFilter()中應該有效。

我的另一個想法是,也許你應該考慮使用Acl組件和Auth組件。 Acl組件將爲您提供對每個控制器中的每個動作的開箱即用的細粒度控制。如果使用正確,您只需爲每個角色的操作設置權限,並且您正在嘗試執行的訪問控制檢查類型將會自動執行。

這本書有一個很好的教程,如何使這項工作。我在我的應用程序中使用它,它非常值得花時間來設置和了解它是如何工作的。下面參考。

CakePHP Book :: Simple Acl controlled Application

+0

+1針對AcL提示。你一定要使用ACL功能,因爲這正是你想要的。 – vindia 2011-06-07 16:18:00

+1

我希望避免ACL組件,因爲我已經多次嘗試過這個教程,還有其他各種插件失敗。如果您已經使用了本書以外的內容,我會非常感激。此外,如果您使用本書教程,則在您更改角色時不會編輯用戶的acl。 – Chris 2011-06-07 19:30:55

+0

@Chris當角色發生變化時,您可以在代碼中輕鬆檢測到這一點,並執行'Acl :: allow()'。 Acl是要走的路,我對這裏的其他人很有信心。此外,你可以直接通過'ClassRegistry :: init()'獲取對它的引用來編輯'acl'表。本教程中的Aco示例創建代碼可以實現這一點,並讓您深入瞭解如何在使用該組件時獲得更多功能。這值得再拍一次。 – generalopinion 2011-06-09 15:45:01