Laravel 4 条件路由过滤器

Posted

技术标签:

【中文标题】Laravel 4 条件路由过滤器【英文标题】:Laravel 4 conditional route filter 【发布时间】:2015-08-30 15:34:27 【问题描述】:

我有一组路由,我希望仅当用户位于某个部门或他们尝试访问的路由中的 id 与他们的登录 id 匹配时才允许用户访问。

我有:

Route::group(array('before' => 'auth.department:6|auth.me'), function () 

    Route::get('users/id/outofoffice', ['as' => 'users.outofoffice.form', 'uses' => 'RackspaceController@outOfOfficeForm']);
    Route::post('users/id/outofoffice', ['as' => 'users.outofoffice.save', 'uses' => 'RackspaceController@outOfOfficeSave']);

    Route::get('users', ['as' => 'users.list', 'uses' => 'UserController@index']);
    Route::get('users/id/edit', ['as' => 'users.edit', 'uses' => 'UserController@edit']);
    Route::post('users/id', ['as' => 'users.update', 'uses' => 'UserController@update']);

);

但它不起作用,以前的 'auth.department:6' 按预期工作,但是当我将其更改为 'auth.department:6|auth.me' 时,用户仍然被拒绝访问。过滤器定义为:

Route::filter('auth.department', function($route, $request)

if(Auth::level() > 5) return null;

$departmentIds = array_slice(func_get_args(), 2);

if(!in_array(Auth::dept(), $departmentIds)) 
    if (Request::ajax())
    
        return Response::make('Unauthorized', 401);
    
    else
    
        return Response::make('Unauthorized', 401);
    


);

Route::filter('auth.me', function(\Illuminate\Routing\Route $route, $request)
if($route->getParameter('id') == Auth::id()) 
    return null;
 else 
    return BaseController::failed(['authorization' => ['Unauthorized']], 401);

);

我这样做了:

Route::filter('auth.dept-6-or-me', function(\Illuminate\Routing\Route $route, $request)
if(Auth::level() > 5) return null;
$departmentIds = array_slice(func_get_args(), 2);
if($route->getParameter('id') == Auth::id()) 
    return null;

elseif(!in_array(Auth::dept(), $departmentIds)) 
    if (Request::ajax())
    
        return Response::make('Unauthorized', 401);
    
    else
    
        return Response::make('Unauthorized', 401);
    
 else 
    if (Request::ajax())
    
        return Response::make('Unauthorized', 401);
    
    else
    
        return Response::make('Unauthorized', 401);
    

);

【问题讨论】:

我很确定filter1|filter2 中的| 表示“和”,而不是“或”。除非有人构建了另一个解决方案,否则您可能必须创建第三个过滤器,唯一的工作就是调用其他两个过滤器。 我很确定乔尔是对的 @JoelHinz 谢谢,我制作了另一个过滤器,两者都可以。 【参考方案1】:

不是解决方案,但也许这会对某人有所帮助。

同样的事情,这里提到了解决方法How to apply multiple filters on Laravel 4 route group?

我现在也测试了这个,因为我遇到了同样的问题。所以,|符号仅表示 AND,它的工作原理是这个原理,我将它与 Sentry 插件一起使用。

Route::post('/insert', array('as' => 'insertKom', 'uses' => 'KommunikationController@insertKom', 'before' => 'hasAccess:admin|hasAccess:contact.insert'));

例如我的 2 个权限是:

hasAccess:admin: 1
hasAccess:contact.insert: 1

此方案通过,用户可以访问路由。

将权限更改为:

hasAccess:admin: 0
hasAccess:contact.insert: 1

不过,这个解决方案还是以某种方式通过了。用户访问了该路线。不太清楚为什么。

将权限更改为:

hasAccess:admin: 1
hasAccess:contact.insert: 0

而这个没有通过。用户无权访问该路由。有趣的事情,就像它只检查最后一个权限。

【讨论】:

以上是关于Laravel 4 条件路由过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 将资源路由覆盖到不同的路由过滤器组

Laravel 过滤路由

laravel 路由过滤器检查用户角色

Laravel 将参数从路由传递到过滤器

Laravel,路由通配符过滤然后控制器

在 Laravel 中:如何根据 URI 将多个过滤器应用于一整套路由?