Создадим три рута:
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 .