Я пытаюсь реализовать 3 типа пользователей в своем приложении, я использую аутентификацию Laravel по умолчанию.
Я создал 2 дополнительных промежуточных программного обеспечения для достижения дополнительных условий пользователя (admin и Districtlogin) вместе с промежуточным программным обеспечением для утверждения пользователем и использовал значение по умолчанию для пользователя laravel.
Admin middleware
class Admin
{
tion handle($request, Closure $next)
{
if ( Auth::check() && Auth::user()->isAdmin == 1)
{
return $next($request);
}
Auth::logout();
return redirect('login')->with('error','You have not admin access');
}
}
Districtlogin Middleware
class Districtlogin
{
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::user()->isAdmin == 2) {
return $next($request);
}
Auth::logout();
return redirect('login')->with('error', 'You have not admin access');
}
}
One additional middleware to check if the user is approved
class ApproveUser
{
public function handle($request, Closure $next)
{
if ( Auth::check() && Auth::user()->row_status == 1)
{
return $next($request);
}
return redirect('/userapprove');
}
Я могу перенаправить их на основе входа
Auth/LoginController
public function redirectPath()
{
if (Auth::user()->isAdmin == 1 && Auth::user()->row_status == 1) {
return '/adminindex';
} elseif (Auth::user()->row_status == 0) {
return '/userapprove';
} elseif (Auth::user()->isAdmin == 2 && Auth::user()->row_status == 1) {
return '/districtindex';
}
return '/engineerdashboard';
}
Вот мой
kernel.php
Вход
'admin' => \App\Http\Middleware\Admin::class,
'districtlogin' => \App\Http\Middleware\Districtlogin::class,
'userapprove' => \App\Http\Middleware\ApproveUser::class,
Я хотел бы сгруппировать промежуточное ПО admin и Districtlogin.
Я использую CRUD, я хотел бы, чтобы Districtlogin имел доступ к нескольким контроллерам - индекс, магазин, обновление
Когда я пытаюсь сгруппировать промежуточное ПО, меня перенаправляют обратно на экран входа в систему. Ни одно промежуточное ПО не работает
Вот что я пробовал,
1)
Route::middleware(['admin'])->group(function () {
//Admin Dashboard
Route::resource('adminindex', 'AdminindexController')->middleware('districtlogin');
Route::get('adminindex/new', 'AdminindexController@admindashboard');
});
2)
Route::middleware(['admin','districtlogin'])->group(function () {
//Admin Dashboard
Route::resource('adminindex', 'AdminindexController');
Route::get('adminindex/new', 'AdminindexController@admindashboard');
});
3)
Route::middleware(['admin',''])->group(function () {
//Admin Dashboard
Route::resource('adminindex', 'AdminindexController');
Route::get('adminindex/new', 'AdminindexController@admindashboard');
Route::middleware(['districtlogin'])->group(function () {
Route::resource('adminindex', 'AdminindexController');
});
});
Но когда я использую условие «ИЛИ», я могу получить доступ к страницам
Route::group(['middleware' => ['admin' OR 'districtlogin']], function () {
//Admin Dashboard
Route::resource('adminindex', 'AdminindexController');
Route::get('adminindex/new', 'AdminindexController@admindashboard');
});
Контроллеры доступны для обоих промежуточных программ. Но как мне ограничить функции Crud на основе промежуточного программного обеспечения.
Я совершенно не знаю, как этого добиться.
Спасибо за быстрый ответ @NikosM. Я создам новые маршруты для другого промежуточного программного обеспечения :)
@НикосМ. Не могли бы вы сообщить мне: «Либо измените промежуточное программное обеспечение, чтобы оно имело какую-то общую основу (например, Auth::check() && Auth::user()->isAdmin > 1)».
извините, я имел в виду Auth::check() && Auth::user()->isAdmin >= 1 это включает в себя оба случая, когда isAdmin = 1 или isAdmin = 2, поэтому есть точки соприкосновения, и промежуточные программы могут быть сгруппированы вместе, на самом деле достаточно одного промежуточного программного обеспечения с вышеуказанным условием, и ТОГДА в вашем коде проверьте, является ли isAdmin 1 или 2. Но лучше иметь разные маршруты, если вам нужны очень разные функции для каждого типа пользователя.






Полный ответ:
Два промежуточных ПО — несовместимы друг с другом, у них есть нет точек соприкосновения. Там, где один преуспевает, другой терпит неудачу и перенаправляет на страницу входа.
Итак, это объясняет первую часть вашего вопроса.
Вторая часть заключается в том, что Route::group(['middleware' => ['admin' OR 'districtlogin']] .. не имеет смысла в отношении настройки промежуточного программного обеспечения. это эквивалентно Route::group(['middleware' => ['admin']] .., поскольку выражение 'admin' OR 'districtlogin' всегда оценивается как первый операнд. Плюс это вводит в заблуждение, поскольку Laravel не поддерживает наличие промежуточного программного обеспечения ни того, ни другого это бессмысленное выражение.
Решение:
Либо используйте одно промежуточное ПО, который может поддерживать оба варианта, например:
class AdminOrDistrictlogin
{
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::user()->isAdmin >= 1 ) {
return $next($request);
}
Auth::logout();
return redirect('login')->with('error', 'You have not admin access');
}
}
entry:
'adminOrdistrict' => \App\Http\Middleware\AdminOrDistrictlogin::class,
'userapprove' => \App\Http\Middleware\ApproveUser::class,
routes:
Route::middleware(['adminOrdistrict'])->group(function () {
//Admin or District Dashboard, distignuish later in your code
Route::resource('adminindex', 'AdminindexController');
Route::get('adminindex/new', 'AdminindexController@admindashboard');
});
А в ваших контроллерах и представлениях уточняйте, проверяя значение Auth::user()->isAdmin для различения простых администраторов или районов.
Или, если функциональность сильно различается между простыми админами и районами, создавать новые и разные маршруты для admin и district и использовать каждое промежуточное ПО в соответствующей группе маршрутов для каждого типа пользователя.
Например:
Route::middleware(['admin'])->group(function () {
//Admin Dashboard
Route::resource('adminindex', 'AdminindexController');
Route::get('adminindex/new', 'AdminindexController@admindashboard');
});
Route::middleware(['districtlogin'])->group(function () {
//District Dashboard
Route::resource('districtindex', 'DistrictindexController');
Route::get('districtindex/new', 'DistrictindexController@admindashboard');
});
Твой выбор :)
ваши два промежуточных программного обеспечения несовместимы, чтобы иметь их вместе. Каждый проверяет условие, НЕ ВЫПОЛНЯЕМОЕ другим, поэтому НЕТ ОБЩЕГО ЗНАЧЕНИЯ, чтобы сгруппировать их вместе. Либо измените свое промежуточное ПО, чтобы оно имело какую-то общую основу (например,
Auth::check() && Auth::user()->isAdmin > 1), либо используйте разные маршруты для каждого промежуточного ПО.