laravel - 如何在2路组中使用相同的URL

时间:2014-12-12 08:56:00

标签: php laravel laravel-4 laravel-routing laravel-filters

假设我有2个过滤器

1)管理员 2)SuperAdmin

过滤器:

 Route::filter('Admin', function($route, $request)
 {
   if ( ! Auth::user()->Admin()) {
   return Response::json(array('flash' => 'You are not authorized.'), 401);
 }
});

Route::filter('SuperAdmin', function($route, $request)
{
  if ( ! Auth::user()->SuperAdmin()) {
  return Response::json(array('flash' => 'You are not authorized.'), 401);
}
});

路线:

Route::group(array('before' => array('auth|Admin')), function()
{

    Route::get('/report/{id}','ReportCntrl@getreport');
    Route::get('/create1','ReportCntrl@create1');

}


Route::group(array('before' => array('auth|SuperAdmin')), function()
{

    Route::get('/report/{id}','ReportCntrl@getreport');
    Route::get('/create2','ReportCntrl@create2');
    Route::get('/create3','ReportCntrl@create3');

}

所以问题是当我从superadmin登录时它表示未经授权的访问

因为我认为它将我的请求传递给两个过滤器并且一个批准它,然后第二个拒绝它。

我是否有任何方法可以实际使用来自Laravel中2个路线组的相同网址。

3 个答案:

答案 0 :(得分:1)

您可以这样做:

Route::filter('AdminAndSuperAdmin', function($route, $request)
 {
   if ( ! Auth::user()->Admin() && ! Auth::user()->SuperAdmin()) {
   return Response::json(array('flash' => 'You are not authorized.'), 401);
 }
});



// this route will work for both admin and super admin
Route::group(array('before' => array('auth|AdminAndSuperAdmin')), function()
{

    Route::get('/report/{id}','ReportCntrl@getreport');

} 


Route::group(array('before' => array('auth|Admin')), function()
{

    Route::get('/create1','ReportCntrl@create1');

}


Route::group(array('before' => array('auth|SuperAdmin')), function()
{

    Route::get('/create2','ReportCntrl@create2');
    Route::get('/create3','ReportCntrl@create3');

}

答案 1 :(得分:1)

由于定义顺序,分组Laravel路线可能会造成混淆。过滤器在之前路由定义,但在路由过程中首先匹配路由,然后才应用过滤器。

如果虚假的过滤器(比如说SuperAdmin == false)会让Laravel忽略这条路线,那么你想要达到的目标才有效。

我建议让Auth::user()->Admin()评估为true超级管理员。这样,相同的路线仍然可以工作,但所有不同的路线(组之间)都能正常工作。

答案 2 :(得分:1)

您必须使用一个过滤器。但是您可以使用过滤器参数使其具有动态性和可重用性。

Route::filter('role', function($route, $request, $value){
    $allowedRoles = explode(';', $value);
    $user = Auth::user();
    if(in_array('Admin', $alloweRoles) && $user->Admin()){
        return;
    }
    else if(in_array('SuperAdmin', $allowedRoles) && $user->SuperAdmin()){
        return;
    }
    return Response::json(array('flash' => 'You are not authorized.'), 401);
});

你这样使用它:

Route::group(array('before' => array('auth|role:Admin;SuperAdmin')), function(){
    Route::get('/report/{id}','ReportCntrl@getreport');
}

解释

Laravel会自动按顺序传递三个过滤器参数($route, $request, $value)。第三个参数$value包含:之后传递的所有内容。 Laravel docs

$request是当前请求对象(Illuminate\Http\Request的实例)和$route当前路由对象(lluminate\Routing\Route的实例)