2015-06-15 125 views
3

我有一組路由,我想讓用戶只有在某個部門或他們試圖訪問的路由中的ID與他們登錄的ID相匹配時才能訪問。Laravel 4條件路由過濾器

我:

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

    Route::get('users/{id}/outofoffice', ['as' => 'users.outofoffice.form', 'uses' => '[email protected]']); 
    Route::post('users/{id}/outofoffice', ['as' => 'users.outofoffice.save', 'uses' => '[email protected]']); 

    Route::get('users', ['as' => 'users.list', 'uses' => '[email protected]']); 
    Route::get('users/{id}/edit', ['as' => 'users.edit', 'uses' => '[email protected]']); 
    Route::post('users/{id}', ['as' => 'users.update', 'uses' => '[email protected]']); 

}); 

但它不工作,以前 '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); 
    } 
} 
}); 
+0

我很確定filter1 | filter2中的'|'是指「和」,而不是「或」。除非有人構建了另一種解決方案,否則您可能必須創建第三個過濾器,並且只需調用其他兩個過濾器。 –

+0

我很確定喬爾有權利 –

+0

@JoelHinz謝謝,我做了另一個過濾器,做這兩件事。 – imperium2335

回答

0

不是解決辦法,但也許這將幫助別人。

同樣的事情,周圍的工作在這裏提到How to apply multiple filters on Laravel 4 route group?

還因爲我有同樣的問題我現在已經測試了這個權利。所以,|符號意味着只有和,它的工作原理,我用它與Sentry插件。

Route::post('/insert', array('as' => 'insertKom', 'uses' => '[email protected]', '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 

而這一次沒有通過。用戶無權訪問該路線。有趣的事情,就像它只檢查最後一個權限。