Поэтапная разработка сайта на Laravel 4: урок №5 (часть 2)

Всем доброго времени суток 🙂

Рад представить вашему вниманию продолжение пятого урока. В нем мы реализуем функционал регистрации и авторизации пользователей, рассмотрев имеющиеся в Laravel средства для этого. Но сперва предлагаю посмотреть вступительное видео, в котором будет виден конечный результат этого урока:

Итак, приступим.

Для начала нам необходимо создать таблицу в базе, которая будет содержать пользователей сайта. Для этого создадим миграцию  create_users_table :

У пользователя будут для начала следующие поля:

  • id  — идентификатор пользователя
  • email  — E-Mail пользователя (уникальный)
  • password — хэшированный пароль
  • username — никнейм
  • isAdmin — является ли этот пользователь администратором сайта
  • isActive — активирован ли этот пользователь (подтвердил ли он свой E-Mail)
  • activationCode — код активации (подтверждения) E-Mail
  • created_at ,  updated_at — времена создания и обновления записи в базе

Сама миграция (метод up ) для этой таблицы будет выглядеть следующим образом:

Строку 26 стоит рассмотреть отдельно. В Laravel во время авторизации имеется возможность «запомнить» пользователя, чтобы при последующих открытиях страниц сайта ему не приходилось заново вводить свои данные (логин/email и пароль). Для этого пользователю передается специальный cookie, содержащий этот самый токен. Этот токен — просто случайная строка длиной 100 символов, привязанная к пользователю, однозначно идентифицируя его. Токен появился в Laravel совсем недавно, начиная с версии 4.1.26. Раньше в cookie передавался просто зашифрованный id пользователя, что считалось уязвимостью, так как в случае, если этот cookie попадал к злоумышленнику, тот получал полный контроль над учетной записью, причем жертву в этом случае уже ничего не могло спасти, даже смена пароля. С введением случайного токена проблема стала менее критичной: даже если cookie попадет к злоумышленнику, пользователь сможет сменить свой пароль, в результате чего будет сгенерирован новый случайный токен, таким образом старый cookie будет недействительным.

Примечание: 26ю строку можно заменить на:

С таблицей закончили. Теперь можно приступать к модели пользователя.

С каждой инсталляцией 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 , чтобы мы могли заполнять модель данными при регистрации:

Теперь можно приступать к регистрации пользователей.

Для начала создадим контроллер UsersController , который будет отвечать за все операции с пользователями,  и пропишем маршруты к нему в файле app/routes.php :

Первое, что нам нужно, это отобразить форму с регистрацией. Для этого создадим метод getRegister  в контроллере с таким содержимым:

Этот метод просто вернет шаблон users/register  при GET-запросе на /users/register . Давайте создадим сам шаблон. Создадим папку users  внутри app/views , и в ней файл register.blade.php :