laravel — Как я могу использовать один и тот же URL в группе из 2 маршрутов?

Предположим, у меня есть 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.

0

Решение

Вы должны использовать один фильтр. Но вы можете использовать параметры фильтра, чтобы сделать его динамичным и многократно используемым.

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)

1

Другие решения

Группировка маршрутов Laravel может привести к путанице из-за порядка определения. Фильтры определены до маршруты, но во время маршрутизации сначала сопоставляются маршруты, и только затем применяются фильтры.

То, чего вы пытаетесь достичь, сработает, только если ложные фильтры (скажем, SuperAdmin == false) заставят Laravel игнорировать маршрут.

Я бы предложил сделать Auth::user()->Admin() также оценить true для супер админов. Таким образом, равные маршруты все равно будут работать, но все разные маршруты (между группами) будут работать правильно.

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
По вопросам рекламы [email protected]