2014-09-20 72 views
0

我有一個關於過濾控制器及其對多個用戶角色的操作的問題。可以說我有一個名爲控制器myController的:Laravel控制器構造函數中的多個角色過濾器

public class MyController extends \BaseController 
{ 
    public static function index() 
    { 
    } 

    public static function show() 
    { 
    } 

    public static function create() 
    { 
    } 

    public static function store() 
    { 
    } 

    public static function other() 
    { 
    } 
} 

,我有2個過濾器的每個角色,名爲admin和工作人員:

Route::filter('admin', function() 
{ 
    // Lines of code to get role 
    if($role != 'admin') return View::make('errors.401'); 
}); 

Route::filter('staff', function() 
{ 
    // Lines of code to get role 
    if($role != 'staff') return View::make('errors.401'); 
}); 

然後,我嘗試使用beforeFilter上的構造myController的:

public function __construct() 
{ 
    $this->beforeFilter('admin', ['only' => ['index', 'show', 'create', 'store']]); 
    $this->beforeFilter('staff', ['only' => ['index', 'show']]); 
} 

當我將第一個beforeFilter,它的工作原理如我所料(當我登錄到我的工作人員的應用程序,我無法訪問索引,展示,創建和存儲方法)。但是,當我添加第二個過濾器並以員工身份再次登錄時,我無法訪問索引並顯示操作,這是我希望員工可以訪問的操作。

我的問題是,是否可以在控制器的構造函數中爲多個角色定義過濾器? (在這種情況下,我想讓操作索引和顯示可由管理員和員工訪問,但創建和存儲只能由管理員訪問)如果可能,我該如何實現?

謝謝。

回答

0

我假設你有管理員可以訪問所有功能,並且除了「秀」

這是控制器

class MyController extends \BaseController 
{ 
    public function __construct(){ 
     $this->beforeFilter('admin', ['only' => ['show']]); 
    }  
    public function index() 
    { 
    echo "index"; 
    } 

    public function show() 
    { 
    echo "show"; 
    } 
} 

人員可以訪問一切在你上一篇文章中看到,你正在使用公共類,我相信在PHP中你只需要類,在函數中最好不要使用靜態。

這裏是filters.php

Route::filter('admin', function() 
{ 
    // Lines of code to get role 
    if($role != 'admin') return "This is only for admin"; 
}); 

在routes.php文件

Route::get("/my", "[email protected]"); 
Route::get("/show", "[email protected]"); 

然後嘗試以管理員身份登錄,您將可以訪問 「指數」 和 「秀」 然後試着作爲工作人員登錄,你可以訪問「索引」,但不能訪問「顯示」

0

是否管理員始終是員工?如果是這樣的 - 你可能只是這樣做:

Route::filter('staff', function() 
{ 
    // Lines of code to get role 
    if(($role != 'staff') && ($role != 'admin'))return View::make('errors.401'); 
}); 
+0

不,管理員和員工是2個不同的角色,彼此不相關。 – AWJ 2014-09-20 04:05:13

1

首先你應該做一個控制器應該處理訪問控制......如下

的Acl控制器

class ACLController extends \BaseController { 

     /** 
     * admin access control list 
     * @return array 
     */ 
     private function adminACL() { 
      return array(
       'users' => array(
        'users', 
        'users.show', 
    //similar access list for admin users 

       ), 



    ); 
     } 



/** 
    * staff access control list 
    * @return array 
    */ 
    private function staffACL() { 
     return array(

      'staff' => array(
       'staff', 
       'staff.index', 
//similar access list for staff user 

      ), 

     ); 
    } 

//Method that check access of related user 

    /** 
    * check access level 
    * @param string $value 
    * @return boolean 
    */ 
    public function hasAccessLevel($value) { 
     $user = //get user role here 
     if ($user->roles == 'staff') { 
      return TRUE; 

      } elseif ($user->roles == 'admin') { 
       $newAcl = array(); 
       foreach ($this->adminACL() as $aclBreak) { 
        foreach ($aclBreak as $acl) { 
         $newAcl[] = $acl; 
        } 
       } 
       if (!in_array($value, $newAcl)) { 
        return FALSE; 
       } else { 
        return TRUE; 
       } 
      } else { 
       $newAcl = array(); 
       foreach ($this->staffACL() as $aclBreak) { 
        foreach ($aclBreak as $acl) { 
         $newAcl[] = $acl; 
        } 
       } 
       if (!in_array($value, $newAcl)) { 
        return FALSE; 
       } else { 
        return TRUE; 
       } 
      } 
     } 
     } 

過濾器的訪問路線...

Route::filter('hasAccess',function($route,$request,$value){ 
    try{ 
     $Routeacl = new App\Controllers\ACLController();   
     if(!$acl->hasAccessLevel($value)) 
     {    
      return Redirect::to('admin/dashboard')->withErrors(array(Lang::get('en.user_noaccess'))); 
     } 
    }catch(\Exception $e){ 
     echo $e->getMessage(); 
    } 
}); 

然後在你的路線只是檢查是否有訪問

Route::get('/', array('as' => 'index', 'before' => 'hasAccess:index', 'uses' => '[email protected]')); 

編碼愉快:)