Laravel 8 — Как перенаправить на страницу входа, когда вы не вошли в систему

#php #laravel #laravel-8

#php #laravel #laravel-8

Вопрос:

Я использую Laravel 8, и у меня возникли проблемы с перенаправлением пользователя, когда он не вошел в систему. Я нашел несколько похожих вопросов, но все они находятся в более старых версиях laravel, и ни одно из их решений не работает.

Я полагаю, что я должен использовать Route::group() для применения перенаправления ко всем моим маршрутам. В настоящее время это выглядит так:

 // In web.php


Route::group(, function(){
    Route::get('/', [HomeController::class, 'home'])->name('home');
    Route::get('/account', [HomeController::class, 'account'])->name('account');
    Route::get('/feedback', [HomeController::class, 'feedback'])->name('feedback');
    Route::get('/help', [HomeController::class, 'help'])->name('help');
});
  

Я не уверен, что я должен использовать в своем первом параметре в групповой функции. Я считаю, что мне нужно, чтобы просмотреть сеанс или файл cookie, чтобы узнать, есть ли зарегистрированный пользователь?

На данный момент пользователю не разрешается входить в систему, если он находится на странице входа в систему и вводит неправильного пользователя / пароль, поэтому аутентификация работает. Однако, если они вручную введут URL-адрес, например ip:port/help , им будет разрешен доступ.

Я хочу, чтобы все маршруты на сайте перенаправлялись на страницу входа, если пользователь не прошел проверку подлинности.

Мой код аутентификации выглядит так в моем LoginController.php:

 public function doLogin(Request $request){
        DB::connection('mysql');
        $args = $request->except('_token');

        // attempt to do the login
        if (Auth::attempt($args)) {

            // validation successful!
            return redirect('home');

        } else {        

            // validation not successful, send back to form 
            return redirect('login');
        }

    }
  

Мой маршрут для перехода к функции doLogin, которая вызывается из действия html-формы, выглядит следующим образом:

 Route::post('authenticate', [LoginController::class, 'doLogin'])->middleware('web');
  

Если бы кто-нибудь мог дать какие-либо решения или направить меня на правильный путь, это было бы потрясающе. Спасибо!

Редактировать: решение!

В параметре, о котором я спрашивал, мне нужно было просто добавить промежуточное ПО аутентификации.

 Route::group(['middleware' => 'auth'], function(){
    Route::get('/', [HomeController::class, 'home'])->name('home');
    Route::get('/account', [HomeController::class, 'account'])->name('account');
    Route::get('/feedback', [HomeController::class, 'feedback'])->name('feedback');
    Route::get('/help', [HomeController::class, 'help'])->name('help');
});

  

Комментарии:

1. Используйте auth промежуточное программное обеспечение на маршрутах / контроллерах, которое требует аутентификации пользователя. web здесь мало пользы, потому что по умолчанию она уже применяется через ваших провайдеров.

2. web Промежуточное программное обеспечение уже применено ко всем вашим маршрутам web.php … вам нужно auth промежуточное программное обеспечение для перенаправления пользователей, не прошедших проверку подлинности

3. Нужно ли мне вообще настраивать промежуточное программное обеспечение или оно должно работать как есть?

4. Неважно, я понял. Спасибо!

Ответ №1:

вам просто нужно добавить промежуточное программное обеспечение аутентификации, таким образом:

 Route::group(function(){
Route::get('/', [HomeController::class, 'home'])->name('home')->middleware('Auth');
Route::get('/account', [HomeController::class, 'account'])->name('account')->middleware('Auth');
Route::get('/feedback', [HomeController::class, 'feedback'])->name('feedback')->middleware('Auth');
Route::get('/help', [HomeController::class, 'help'])->name('help');
})->middleware('Auth');