Предположим, у меня есть 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
это говорит о несанкционированном доступе
потому что я думаю, что он передает мой запрос обоим фильтрам, и один утверждает его, а второй отклоняет его.
Есть ли способ, который я действительно могу использовать для доступа к тому же URL из 2 групп маршрутов в Laravel.
Вы должны использовать один фильтр. Но вы можете использовать параметры фильтра, чтобы сделать его динамичным и многократно используемым.
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
)
Группировка маршрутов Laravel может привести к путанице из-за порядка определения. Фильтры определены до маршруты, но во время маршрутизации сначала сопоставляются маршруты, и только затем применяются фильтры.
То, чего вы пытаетесь достичь, сработает, только если ложные фильтры (скажем, SuperAdmin == false) заставят Laravel игнорировать маршрут.
Я бы предложил сделать Auth::user()->Admin()
также оценить true
для супер админов. Таким образом, равные маршруты все равно будут работать, но все разные маршруты (между группами) будут работать правильно.
Вы можете сделать что-то вроде этого:
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');
}