Laravel控制器构造函数中的多个角色过滤器

时间:2014-09-20 02:42:01

标签: laravel laravel-4 filter acl before-filter

我有一个关于过滤控制器及其针对多个用户角色的操作的问题。假设我有一个名为MyController的控制器:

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和staff:

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');
});

然后,我试图在MyController的构造函数上使用beforeFilter:

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

当我添加第一个beforeFilter时,它按预期工作(当我以人员身份登录我的应用程序时,我无法访问索引,显示,创建和存储方法)。但是当我添加第二个过滤器并再次以工作人员身份登录时,我无法访问索引并显示操作,这是我希望工作人员可以访问的。

我的问题是,是否可以在控制器的构造函数中为多个角色定义过滤器? (在这种情况下,我想让管理员和员工可以访问操作索引和显示,但只能由管理员访问创建和存储)如果有可能,我怎么能实现?

感谢。

3 个答案:

答案 0 :(得分:1)

首先,你应该制作一个应该处理访问控制的控制器......如下所示

Acl Controller

 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' => 'MyController@Index'));

快乐编码:)

答案 1 :(得分:0)

管理员是否始终是员工?如果是这样 - 你可以这样做:

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

答案 2 :(得分: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", "MyController@index");
Route::get("/show", "MyController@show");

然后尝试以管理员身份登录,您将可以访问" index"并且"显示" 然后尝试以员工身份登录,您将可以访问" index"但无法访问"显示"