#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');