Создадим три рута:
Route::get('/login', 'UserController@loginForm')->name('login.create');
Route::post('/login', 'UserController@login')->name('login');
Route::get('/logout', 'UserController@logout')->name('logout');
Вью
Создадим вью resources/views/user/login.blade.php :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Регистрация</title>
<!-- Google Font: Source Sans Pro -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<link rel="stylesheet" href="{{ asset('assets/admin/admin.css') }}">
</head>
<body class="hold-transition register-page">
<div class="register-box">
<div class="card card-outline card-primary">
<div class="card-header text-center">
<h1>Авторизация</h1>
</div>
@if (isset($error))
<div class="alert alert-danger">
{{ $error }}
</div>
@endif
<div class="card-body">
<form action="{{ route('login') }}" method="post">
@csrf
<div class="input-group mb-3">
<input type="email" name="email" value="{{ old('email') }}" class="form-control"
placeholder="Email">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-envelope"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" name="password" class="form-control" placeholder="Password">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-6 offset-6">
<button type="submit" class="btn btn-primary btn-block">Авторизоваться</button>
</div>
<!-- /.col -->
</div>
</form>
</div>
<!-- /.form-box -->
</div><!-- /.card -->
</div>
<!-- /.register-box -->
<script src="{{ asset('assets/admin/admin.js') }}"></script>
</body>
</html>
Controller
Добавим экшены в контроллер app/Http/Controllers/UserController.php :
public function loginForm() {
return view('user.login');
}
public function login(Request $request) {
$request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (Auth::attempt([
'email' => $request->email,
'password' => $request->password,
])) {
session()->flash('success', 'Вы авторизовались!');
if (Auth::user()->is_admin) {
return redirect()->route('admin.index');
} else {
return redirect()->route('home');
}
}
return redirect()->back()->with('error', 'Не удалось авторизоваться!');
}
public function logout() {
Auth::logout();
return redirect()->route('login.create');
}
Middleware
Для запрета доступа в админку не админам создадим middleware:
php artisan make:middleware AdminMiddleware
Создался файл app/Http/Middleware/AdminMiddleware.php .
Изменим экшен handle :
public function handle(Request $request, Closure $next)
{
if (Auth::check() && Auth::user()->is_admin) {
return $next($request);
}
abort(404);
}
Зарегистрируем наш посредник в app/Http/Kernel.php . В свойство $routeMiddleware добавим:
'admin' => \App\Http\Middleware\AdminMiddleware::class,
И добавим фильтрацию в наши руты:
Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'admin'], function ()
Теперь не админы не смогут видеть нашу админку.
Также добавим еще два посредника в руты:
Route::group(['middleware' => 'guest'], function () {
Route::get('/register', 'UserController@create')->name('register.create');
Route::post('/register', 'UserController@store')->name('register.store');
Route::get('/login', 'UserController@loginForm')->name('login.create');
Route::post('/login', 'UserController@login')->name('login');
});
Route::get('/logout', 'UserController@logout')->name('logout')->middleware('auth');
Эти middleware созданы в приложении автоматически.
Поменяем редирект в app/Http/Middleware/RedirectIfAuthenticated.php в экшене handle:
return redirect()->route('home');
Либо поменяем константу HOME на ‘/’ в app/Providers/RouteServiceProvider.php .