【问题标题】:laravel - How can i use same url in 2 route grouplaravel - 我如何在 2 个路由组中使用相同的 url
【发布时间】:2015-02-10 22:46:22
【问题描述】:

假设我有 2 个过滤器

1) 管理员 2) 超级管理员

过滤器:

 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 个路由组访问相同的 url。

【问题讨论】:

  • 为什么不尝试在SuperAdmin 过滤器中验证Admin
  • 向我们展示两个过滤器的代码,我建议制作一个并执行类似if is_admin or is_superadmin return true;
  • 尝试自定义过滤器Laravel Filters
  • 因为superadmin 拥有一些管理员不应该访问的权限。
  • @Kyslik 更新了问题请提出建议

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


【解决方案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');
}

说明

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

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

【讨论】:

  • 这个太棒了!!
  • 嘿,你能解释一下我将在这 3 个变量 $route =?? $请求=? $value=??
  • @AngularDev 请参阅laravel.com/docs/4.2/routing 部分“指定过滤器参数”。
  • 如果我没记错的话,那里没有正确记录他们没有显示我在这些变量中得到了什么
  • 请求对象?和路线对象?这意味着 1) 过滤器收到请求的 URL frm 2) 假设要命中的控制器的名称。我说的对吗?
【解决方案2】:

由于定义的顺序,对 Laravel 路由进行分组可能会造成混淆。过滤器定义在路由之前,但在路由期间首先匹配路由,然后才应用过滤器。

只有当虚假过滤器(比如 SuperAdmin == false)会使 Laravel 忽略该路由时,您想要实现的目标才会起作用。

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

【讨论】:

  • 请举例?因为如果我这样做,该管理员将能够访问超级管理员的路由
  • @AngularDev 我是否正确假设路由将具有相同的端点?无论是管理员还是超级管理员,/report/{id} 都会转到 ReportCntrl@getreport
  • yaa 但如果我有路由 /create2/create3 专门用于超级管理员,那么会发生什么?
  • @AngularDev 它仍然可以工作,因为这些路由匹配并且应用了 SuperAdmin 过滤器。您的问题在于重复路由以及管理员过滤器返回 401 响应这一事实 - 而不是检查其他定义的路由是否匹配。
【解决方案3】:

你可以这样做:

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

}

【讨论】:

  • 查看我更新的问题,我也添加了一些其他路线。请检查并建议
  • 基本上我也必须为公共 url 建立一个组。当然没有不同的方法,因为这里只提到了 2 个角色,我的应用程序中有更多角色,其中许多人共享很多常用网址
  • @AngularDev 在下面查看 lukasgeiter 的答案,它更具动态性并且适用于任意数量的规则。
猜你喜欢
  • 2021-11-05
  • 2018-10-20
  • 2018-11-04
  • 2021-02-28
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多