2014-02-14 102 views
0

我完全徹底失去了如何做到這一點。我有3個不同的角色:管理員,員工和捐助者。我的問題是,如果未經授權的用戶嘗試訪問來自URL的操作,那麼它確實會讓人感到困惑(對我來說),並具有權限以及適當的重定向。cakePHP-角色授權和路由

在我UsersController我有下列行爲

  1. admin_index
  2. admin_add
  3. admin_edit
  4. admin_view
  5. admin_delete

不帶前綴的行動

  1. 登錄
  2. 註銷
  3. 視圖
  4. 添加
  5. 編輯

管理員應允許訪問所有管理前綴的行動以及登錄和註銷,而工作人員並且捐助者 應該只能訪問後者5.還要注意,所有用戶都使用相同的登錄表單。

在我AppControlles的組成部分,我有以下:

'Auth' => array(
      'loginRedirect' => array( 
       'controller' => 'donors', 
       'action' => 'index' 
      ), 
      'logoutRedirect' => array( 
       'controller' => 'users', 
       'action' => 'login' 
      ), 
      'authorize' => array('Controller') 
) 

然而,在我的登錄操作我檢查用戶角色相應地更改loginRedirect:

if($this->request->is('post')){ 
      if($this->Auth->login()){ 

      switch($this->Auth->user('role')){ 
       case 'admin': 
        $this->Auth->loginRedirect = array('controller'=>'users','action'=>'admin_index','prefix'=>'admin','admin'=>true); 
        break; 
       case 'donor': 
       ... 
       break; 
       case ..... 
      } 
     } 
} 

問題1 現在,如果具有捐助者角色的當前用戶登錄並嘗試訪問localhost/sitename/admin/users/add,那麼他將被重定向到admin/donors而不僅僅是/donors。那麼我怎樣才能刪除管理員前綴?

問題2 此外,我不完全理解藿$這個 - > Auth->允許()的作品。如果在我donorsController我想控制訪問根據角色控制器動作,我該怎麼辦它?例如,如果在我的donorsController中有'刪除'操作,我將如何允許員工用戶同時拒絕授權用戶訪問刪除操作。我相信beforeFilter是解決方案,但無法找到如何去做!任何指針? 謝謝

+1

你應該總是提到你正在使用的確切cakephp版本。提示:不要在這裏創建巨大的控制器代碼開銷,而應該使用簡單的/登錄表單和[Tiny](http://www.dereuromark.de/2011/12/18/tinyauth-the-fastest-和-easy-authorization-for-cake2 /)作爲Auth方法。通過這種方式,每個動作都被明確定義,並且在沒有訪問權限的情況下,所有動作都將重定向到/登錄爲中央登錄表單。 – mark

+0

感謝您的答覆!我瀏覽了你的博客,看起來很乾淨。但是我沒有這個設置,因爲這些角色在用戶的表中被定義爲一個字段,而不是一個模型。此外,我仍然有理解$ this-> Auth-allow()的工作原理,以及我希望能夠使用我已有的設置來恢復的問題。謝謝! – LogixMaster

+1

只是用戶表字段的作品,以及。閱讀文檔。不一定是模特。 – mark

回答

1

1)在你的登錄()動作用於教學貫徹用戶角色檢查,如果角色是admin重定向到任何控制器/動作,並設置管理員前綴。如果他不是管理員將他重定向到別的東西。

if ($this->Auth->login()) { 
    if ($this->Auth->user('role') === 'admin') { 
     $this->redirect(array(
      'admin' => true, 
      'controller' => 'foo', 
      'action' => 'bar'))); 
    } else { 
     // Do something else, another redirect or whatever 
    } 
} 

沒有必要從URL中刪除/ admin作爲它應該顯示未授權用戶HES當他試圖訪問,他是不允許的URL。

2)如果你想授予不同角色的訪問權限,你可以使用我寫的SimpleRbacAuth。它如何工作的Check the tests for examples。您只需定義一個嵌套數組結構並將您想要的角色添加到動作或整個控制器中,或者使用*爲每個人授予訪問權限。

+0

我一定會檢查你的rbac代碼!然而,檢查登錄操作中的角色是我已經在做的事情(因此對這個問題不太有幫助,但可能對訪問者有幫助)! – LogixMaster

1

這可能是一個解決方案。

轉到core.php文件並取消註釋如果存在/添加如果不存在下面的行。

Configure::write('Routing.prefixes', array('admin')); 
Location: app/config/core.php 

把下面的代碼AppController.php(餅版本2.X)/ app_controller.php(餅版本< 2的beforeFilter方法內。X)

function beforeFilter(){ 
    if($this->Auth->user('role') == 'admin'){ 
     if(!in_array($this->params['action'],array('login','logout')) && (stristr($this->params['action'], 'admin_') === FALSE)){ 
      $this->redirect(array("controller"=>$this->params['controller'],"action"=>'admin_'.$this->params['action'],"admin" => 1)); 
     } 
    }else{ 
     if(stristr($this->params['action'], 'admin_')){ 
     $action = explode('_',$this->params['action']); 
     $this->redirect(array("controller"=>$this->params['controller'],"action"=>$action[1],"admin" => false)); 
     } 
    } 
} 

您可以通過處理自定義錯誤頁面來管理的其他功能。

你可以參考Customize error pae

+0

這是不必要的複雜。請求中有'前綴',不需要解析前綴的操作,登錄和註銷操作可以由Auth組件設置來定義。 – burzum

+0

謝謝!這可能不完全是我想要的,因爲它只是從URL中刪除管理員前綴,這是我在我的問題中要求的。因此,將其標記爲「已回答」,因爲我實際上認爲我可以使用這個功能!還爲+1高亮定製錯誤頁面! – LogixMaster

+0

@burzum你能不能詳細解釋一下這件事,爲什麼這很複雜,或者如果有更好的方法去做呢?謝謝 – LogixMaster