#php #laravel #laravel-5 #crud #middleware
#php #laravel #laravel-5 #crud #промежуточное программное обеспечение
Вопрос:
Я пытаюсь внедрить в свое приложение 3 типа пользователей, я использую авторизацию Laravel по умолчанию.
Я создал 2 дополнительных промежуточных программного обеспечения, чтобы выполнить условия для дополнительного пользователя (admin amp; District Login) вместе с промежуточным программным обеспечением для утверждения пользователем и используя значение по умолчанию для пользователя laravel
Промежуточное программное обеспечение администратора
class Admin
{
tion handle($request, Closure $next)
{
if( Auth::check() amp;amp; Auth::user()->isAdmin == 1)
{
return $next($request);
}
Auth::logout();
return redirect('login')->with('error','You have not admin access');
}
}
District Login Промежуточное программное обеспечение
class Districtlogin
{
public function handle($request, Closure $next)
{
if (Auth::check() amp;amp; Auth::user()->isAdmin == 2) {
return $next($request);
}
Auth::logout();
return redirect('login')->with('error', 'You have not admin access');
}
}
Одно дополнительное промежуточное программное обеспечение для проверки, одобрен ли пользователь
class ApproveUser
{
public function handle($request, Closure $next)
{
if( Auth::check() amp;amp; Auth::user()->row_status == 1)
{
return $next($request);
}
return redirect('/userapprove');
}
Я могу перенаправить их на основе входа
Auth / LoginController
public function redirectPath()
{
if (Auth::user()->isAdmin == 1 amp;amp; Auth::user()->row_status == 1) {
return '/adminindex';
} elseif (Auth::user()->row_status == 0) {
return '/userapprove';
} elseif (Auth::user()->isAdmin == 2 amp;amp; Auth::user()->row_status == 1) {
return '/districtindex';
}
return '/engineerdashboard';
}
Вот мой
kernel.php
запись
'admin' => AppHttpMiddlewareAdmin::class,
'districtlogin' => AppHttpMiddlewareDistrictlogin::class,
'userapprove' => AppHttpMiddlewareApproveUser::class,
I would like to group the admin and Districtlogin middleware.
Я использую CRUD, я бы хотел, чтобы District Login имел доступ к нескольким контроллерам — индексировать, хранить, обновлять
Когда я пытаюсь сгруппировать промежуточное программное обеспечение, я перенаправляюсь обратно на экран входа в систему. Ни одно из промежуточных программных средств не работает
Вот что я пробовал,
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 на основе промежуточного программного обеспечения.
Я совершенно не представляю, как этого добиться.
Комментарии:
1. ваши два промежуточных программного обеспечения несовместимы, чтобы иметь их вместе. Каждое из них проверяет условия, КОТОРЫМ НЕ соответствует другое, поэтому нет ОБЩЕЙ ОСНОВЫ для того, чтобы сгруппировать их вместе. Либо измените ваше промежуточное программное обеспечение, чтобы оно имело некоторую общую основу (например
Auth::check() amp;amp; Auth::user()->isAdmin > 1
), либо используйте разные маршруты для каждого отдельного промежуточного программного обеспечения2. Спасибо за быстрый ответ @NikosM. Я создам новые маршруты для другого промежуточного программного обеспечения 🙂
3. @NikosM. Не могли бы вы, пожалуйста, проинформировать меня о «Либо измените ваше промежуточное программное обеспечение, чтобы оно имело какую-то общую основу (например, Auth:: check() amp;amp; Auth:: user()-> isAdmin> 1)».
4. извините, я имел в виду,
Auth::check() amp;amp; Auth::user()->isAdmin >= 1
это включает в себя оба случая, когда isAdmin = 1 или isAdmin = 2, так что есть общая основа, и промежуточные программы могут быть сгруппированы вместе, на самом деле достаточно одного промежуточного программного обеспечения с вышеуказанным условием, а ЗАТЕМ в вашем коде проверьте, равен ли isAdmin 1 или 2. Но лучше иметь разные маршруты, если вам нужна совершенно разная функциональность для каждого типа пользователя
Ответ №1:
Полный ответ таков:
Два промежуточных программного обеспечения несовместимы друг с другом, у них нет точек соприкосновения. Там, где одно удается, другое завершается неудачей и перенаправляется на страницу входа.
Итак, это объясняет первую часть вашего вопроса.
Вторая часть заключается в том, что 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() amp;amp; Auth::user()->isAdmin >= 1 ) {
return $next($request);
}
Auth::logout();
return redirect('login')->with('error', 'You have not admin access');
}
}
entry:
'adminOrdistrict' => AppHttpMiddlewareAdminOrDistrictlogin::class,
'userapprove' => AppHttpMiddlewareApproveUser::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');
});
Выбор за вами 🙂