Как сделать регистрацию и авторизацию пользователей в laravel 5.8.
Также ограничение регистрации и авторизация по логину вместо емейла.
"Баг" 403 при обращении к /admin
на самом деле все просто - на сервере в директории public не должно быть папокок и/или файлов с именами роутов прописанных в /routes/web.php
Первоначальная настройка:
Для начала выполняем в консоли:
php artisan make:auth
php artisan migrate
Это автоматически добавит необходимый функционал и даже соответствующие ссылки в базовый шаблон (/register и /login).
Если, как и мне, Вам не нужна регистрация, то на данном этапе можно зарегистрировать себе пользователя, что бы не пришлось делать это руками.
Запрет регистрации (оставляем только авторизацию):
Автоматически в файл с маршрутами /routes/web.php, добавляется
Этот метод содержит код:
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
Нам из него нужно только:
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
стоит обратить внимание замену
$this->
на
Route::
Доступ к административному разделу только для авторизованных пользователей.
Создаем middleware через консоль:
php artisan make:middleware AdminMiddleware
После нам нужно будет дописать класс контроллера /app/Http/Middleware/AdminMiddleware.php
и
public function handle($request, Closure $next)
{
if(Auth::check())
{
return $next($request);
}
abort(404);
}
Включаем наш middleware в /app/Http/Kernel.php, добавив:
'admin' => \App\Http\Middleware\AdminMiddleware::class,
Прописываем в /routes/web.php какие маршруты должны проверяться в нашем middleware:
Route::group([
'middleware' => 'admin'
], function (){
Route::get('/admin', 'Admin\DashboardController@index');
Route::resource('/admin/posts', 'Admin\PostsController');
});
Авторизация по имени, а не по Email
Меня не устроило, что по умолчанию пользователь, при авторизации, должен указать емейл ,а не login
Нужно в /app/Http/Controllers/Auth/LoginController.php, добавить метод:
public function username()
{
return 'name';
}
И изменить саму форму /resources/views/auth/login.blade.php:
Блок с именем нужно заменить на:
<label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="name" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>