Урок 4. Простая авторизация и регистрация в Laravel
На этом уроке из серии уроков по Laravel мы создадим еще пару форм и попробуем с помощью них авторизовываться и регистрироваться на сайте. Для хранения данных о пользователях есть дефолтная таблица users. Теперь перейдем к практике. Для начала в файле routes/web.php пропишем наш новый урл
Route::get('/login', function () { return view('login'); });Затем добавим файл представления D:\xampp\htdocs\new_project\resources\views\login.blade.php
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Вход</title> <link href="css/app.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="row"> <form method="POST" action="login" style="text-align: center; margin: auto;"> {!! csrf_field() !!} <div> Email <input style="margin: 10px;" type="email" name="email" value="{{ old('email') }}"> </div> <div> Пароль <input style="margin: 10px;" type="password" name="password" id="password"> </div> <div> <input style="margin: 10px;" type="checkbox" name="remember"> Запомнить меня </div> <div> <button style="margin: 10px;" type="submit">Вход</button> </div> </form> </div> </div> <script src="js/app.js"></script> </body> </html>Получается просто, но со вкусом (наверное, я не дизайнер)
Немного теории: получение аутентифицированного пользователя
После установки стартового набора аутентификации и разрешения пользователям регистрироваться и аутентифицироваться в вашем приложении вам часто придется взаимодействовать с текущим аутентифицированным пользователем. При обработке входящего запроса вы можете получить доступ к аутентифицированному пользователю с помощью пользовательского метода auth facade:
use Illuminate\Support\Facades\Auth; $user = Auth::user(); $id = Auth::id();Возвращаемся к нашим баранам практике. Создаем AuthController.php в app\Http\Controllers
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class AuthController extends Controller { public function postSignin(Request $request) { echo "jk"; } }Теперь возвращаемся к роутингу. Сначала добавляем, чтобы выводило только для гостей, а также обработчик пост-запроса
Route::middleware('guest')->group(function() { Route::get('/login', function () { return view('login'); }); Route::post('/login', 'AuthController@postSignin'); });Пробуем..и получаем ошибку
Illuminate\Contracts\Container\BindingResolutionException Target class [AuthController] does not exist. http://localhost/new_project/public/loginЕще немного меняем роутинг:
Route::middleware('guest')->namespace('\App\Http\Controllers')->group(function() { Route::get('/login', function () { return view('login'); }); Route::post('/login', 'AuthController@postSignin' ); });Отлично, теперь у нас при пост-запросе идет обращение к контроллеру. Измениим его так
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class AuthController extends Controller { public function postSignin(Request $request) { if (! Auth::attempt($request->only('email', 'password'), $request->has('remember'))) { var_dump($request); echo 'Неправильный логин или пароль'; } else { echo 'Вы успешно авторизовались'; } } }Добавим через phpmyadmin в таблицу users нового пользователя с паролем “test” и .. и не зайдется. Что ж, давайте тогда попробуем зарегистрироваться встроенными средствами Laravel 8. Добавим в роутер:
//регистрация нового пользователя Route::get('/reg', function () { return view('reg'); }); Route::post('/reg', 'AuthController@postReg');А также представление страницы регистрации reg.blade.php
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Регистрация</title> <link href="css/app.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="row"> <form method="POST" action="reg" style="text-align: center; margin: auto;"> {!! csrf_field() !!} <div> Имя <input style="margin: 10px;" type="text" name="name" id="name"> </div> <div> Email <input style="margin: 10px;" type="email" name="email" id="email"> </div> <div> Пароль <input style="margin: 10px;" type="password" name="password" id="password"> </div> <div> <button style="margin: 10px;" type="submit">Зарегистрироваться</button> </div> </form> </div> </div> <script src="js/app.js"></script> </body> </html>Ну и изменим контроллер:
/** * Создает нового пользователя, автоматически авторизуя его * * @param Request $request * @return void */ public function postReg(Request $request) { $user = User::create([ 'email' => $request->input('email'), 'name' => $request->input('name'), 'password' => bcrypt($request->input('password')) ]); Auth::loginUsingId($user->id); return redirect() ->route('home') ->with('success', 'Вы успешно зарегистрировались'); }Пробуем зарегистрироваться и получаем ошибку:
Symfony\Component\Routing\Exception\RouteNotFoundException Route [home] not defined. http://localhost/new_project/public/regНу да, контроллер не знает про наш home, разберемся с этим на следующем уроке, а сейчас переходим в базу данных с помощью phpmyadmin и видим там нашего зарегистрированного пользователя:
И теперь, кстати, мы сразу понимаем, почему не заходилось с тестовым логином-паролем, созданным напрямую – так как пароль хранится в БД в зашифрованном (точнее, хэшированном виде). Проверив это, пробуем выйти (удалив куки сайта) и зайти и все получается
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.