Всем доброго времени суток 🙂
Рад представить вашему вниманию продолжение пятого урока. В нем мы реализуем функционал регистрации и авторизации пользователей, рассмотрев имеющиеся в Laravel средства для этого. Но сперва предлагаю посмотреть вступительное видео, в котором будет виден конечный результат этого урока:
Итак, приступим.
Для начала нам необходимо создать таблицу в базе, которая будет содержать пользователей сайта. Для этого создадим миграцию create_users_table :
1 |
php artisan migrate:make create_users_table |
У пользователя будут для начала следующие поля:
- id — идентификатор пользователя
- email — E-Mail пользователя (уникальный)
- password — хэшированный пароль
- username — никнейм
- isAdmin — является ли этот пользователь администратором сайта
- isActive — активирован ли этот пользователь (подтвердил ли он свой E-Mail)
- activationCode — код активации (подтверждения) E-Mail
- created_at , updated_at — времена создания и обновления записи в базе
Сама миграция (метод up ) для этой таблицы будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public function up() { Schema::create('users', function(Blueprint $table) { // ID пользователя $table->increments('id'); // E-Mail (уникальный) $table->string('email')->unique(); // Пароль. Для используемой в Laravel хэш-функции требуется не меньше 60 символов $table->string('password', 60); // Никнейм $table->string('username')->unique(); // Админ? $table->boolean('isAdmin'); // Активирован? $table->boolean('isActive')->index(); // Код активации аккаунта $table->string('activationCode'); // Токен для возможности запоминания пользователя $table->rememberToken(); // remember_token // created_at, updated_at $table->timestamps(); }); } |
Строку 26 стоит рассмотреть отдельно. В Laravel во время авторизации имеется возможность «запомнить» пользователя, чтобы при последующих открытиях страниц сайта ему не приходилось заново вводить свои данные (логин/email и пароль). Для этого пользователю передается специальный cookie, содержащий этот самый токен. Этот токен — просто случайная строка длиной 100 символов, привязанная к пользователю, однозначно идентифицируя его. Токен появился в Laravel совсем недавно, начиная с версии 4.1.26. Раньше в cookie передавался просто зашифрованный id пользователя, что считалось уязвимостью, так как в случае, если этот cookie попадал к злоумышленнику, тот получал полный контроль над учетной записью, причем жертву в этом случае уже ничего не могло спасти, даже смена пароля. С введением случайного токена проблема стала менее критичной: даже если cookie попадет к злоумышленнику, пользователь сможет сменить свой пароль, в результате чего будет сгенерирован новый случайный токен, таким образом старый cookie будет недействительным.
Примечание: 26ю строку можно заменить на:
1 $table->string('remember_token', 100)->nullable()->index();
С таблицей закончили. Теперь можно приступать к модели пользователя.
С каждой инсталляцией Laravel идет базовый класс User для пользователя, реализующий некоторые интерфейсы, а именно UserInterface и RemindableInterface . Первый необходим для взаимодействия с компонентом Auth , который используется для авторизации пользователей, и содержит два метода: getAuthIdentifier (получить идентификатор пользователя) и getAuthPassword (получить пароль пользователя). Помимо этих двух методов стандартный класс User имеет также методы, необходимые для упомянутой выше авторизации с запоминанием, а именно: getRememberToken , setRememberToken и getRememberTokenName . Начиная с версии 4.2, эти и два предыдущих метода (от интерфейса UserInterface ) вынесены в трейт Illuminate\Auth\UserTrait .
Интерфейс RemindableInterface нужен для реализации имеющегося в Laravel механизма восстановления забытого пароля. Он содержит единственный метод getReminderEmail , возвращающий E-Mail пользователя. Как и в предыдущем случае, начиная с версии 4.2 этот метод вынесен в отдельный трейт: Illuminate\Auth\Reminders\RemindableTrait .
Так как у нас поля пользователя именуются стандартно ( email для почты, password для пароля, и remember_token для токена), то нам подойдет имеющийся изначально вариант модели User . Но Laravel не ограничивает нас в плане именования полей: мы вполне могли бы называть все поля, как нам захочется, будь то userEmail , user_email и т.п., но просто в этом случае пришлось бы проделать немного больше работы.
Итого, в зависимости от того, начиная с какой версии вы создали проект, модель пользователя по умолчанию внутренне может отличаться: все вышеперечисленные методы либо вынесены в трейты, либо реализованы непосредственно в самом классе User . Нам пока потребуется лишь одно маленькое изменение, а именно — добавить поле $fillable , чтобы мы могли заполнять модель данными при регистрации:
1 |
protected $fillable = array('username', 'email', 'password'); |
Теперь можно приступать к регистрации пользователей.
Для начала создадим контроллер UsersController , который будет отвечать за все операции с пользователями, и пропишем маршруты к нему в файле app/routes.php :
1 |
Route::controller('users', 'UsersController'); |
Первое, что нам нужно, это отобразить форму с регистрацией. Для этого создадим метод getRegister в контроллере с таким содержимым:
1 2 3 |
public function getRegister() { return View::make('users/register'); } |
Этот метод просто вернет шаблон users/register при GET-запросе на /users/register . Давайте создадим сам шаблон. Создадим папку users внутри app/views , и в ней файл register.blade.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |