Я знаю, что это очень распространенный вопрос, но я застрял в нем. Я использую Laravel 5.5 и разрабатываю ERP. В ERP некоторые URL-адреса доступны только суперадминистратору, поэтому я создаю промежуточное ПО.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CheckAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = Auth::user();
if ($user->user_role_id == 1) {
return $next($request);
} else {
return redirect('/');
}
}
}
Я зарегистрировал это промежуточное ПО в Kernel.php
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\CheckAdmin::class
];
и использовать это промежуточное ПО в маршрутах
$routes = [
"students" => "StudentsController",
"teachers" => "TeachersController",
"courses" => "CoursesController",
"subjects" => "SubjectsController",
"colleges" => "CollegesController",
"branches" => "BranchesController",
];
Route::group(['middleware' => ['web', 'auth']], function () use ($routes){
Route::match(["get","post"],'/users','UsersController@index')->middleware('admin');
Route::get('/users/status/{id}','UsersController@setStatus')->middleware('admin');
Route::get('/users/delete/{id}','UsersController@delete')->middleware('admin');
Route::match(["get","post"],'/users/add','UsersController@add')->middleware('admin');
Route::match(["get","post"],'/users/edit/{id}','UsersController@edit')->middleware('admin');
Route::match(["get","post"],'/users/view/{id}','UsersController@view')->middleware('admin');
foreach($routes as $route => $class){
Route::match(["get","post"],'/'.$route,$class.'@index');
Route::get('/'.$route.'/status/{id}',$class.'@setStatus');
Route::get('/'.$route.'/delete/{id}',$class.'@delete');
Route::match(["get","post"],'/'.$route.'/add',$class.'@add');
Route::match(["get","post"],'/'.$route.'/edit/{id}',$class.'@edit');
Route::match(["get","post"],'/'.$route.'/view/{id}',$class.'@view');
}
// additions routes
Route::match(["get","post"],'/courses/assign-subjects','CoursesController@assign_subjects');
Route::match(["get"],'/courses/already-assign-subjects/{id}','CoursesController@already_assigned_subjects');
});
Это промежуточное ПО не вызывается с маршрутами users/*. Когда я регистрирую этот $middleware в kernel.php, он работает, но Auth::user() каждый раз возвращает null. Итак, как я могу проверить вошедшую в систему роль пользователя?
Я где-то читал, что в версии L5.5 Session не работает в constructor, тогда как лучше всего проверить роль пользователя в промежуточном программном обеспечении.
Как выглядит ваша группа промежуточного программного обеспечения в Интернете?






Для проверки промежуточного ПО admin можно использовать вложенное промежуточное ПО.
Route::group(['middleware' => ['web', 'auth']], function () use ($routes){
Route::match(["get","post"],'/users','UsersController@index')->middleware('admin');
Route::group(['middleware' => ['admin'], function () use ($routes){
Route::get('/users/status/{id}','UsersController@setStatus')->middleware('admin');
Route::get('/users/delete/{id}','UsersController@delete')->middleware('admin');
});
Route::match(["get","post"],'/users/add','UsersController@add')->middleware('admin');
Route::match(["get","post"],'/users/edit/{id}','UsersController@edit')->middleware('admin');
Route::match(["get","post"],'/users/view/{id}','UsersController@view')->middleware('admin');
foreach($routes as $route => $class){
Route::match(["get","post"],'/'.$route,$class.'@index');
Route::get('/'.$route.'/status/{id}',$class.'@setStatus');
Route::get('/'.$route.'/delete/{id}',$class.'@delete');
Route::match(["get","post"],'/'.$route.'/add',$class.'@add');
Route::match(["get","post"],'/'.$route.'/edit/{id}',$class.'@edit');
Route::match(["get","post"],'/'.$route.'/view/{id}',$class.'@view');
}
// additions routes
Route::match(["get","post"],'/courses/assign-subjects','CoursesController@assign_subjects');
Route::match(["get"],'/courses/already-assign-subjects/{id}','CoursesController@already_assigned_subjects');
});
Когда промежуточное ПО администратора находится за пределами web and auth, оно всегда будет возвращать null
Надеюсь это поможет
Где Auth :: routes (); ?