Аутентифікація в Rails-додатках за допомогою Devise

Пропоную до вашої уваги один з найкращих, на мій погляд, гемів для автентифікації в rails-додатках. На жаль, українськомовної інформації з даного гему дуже мало, в тому числі і на хабрі, тому хочу висвітлити цю тему. Стаття, в першу чергу, розрахована на новачків і є докладним туторіалом з налаштування автентифікації на основі згаданого гема. У першій частині я висвітлю кроки з базового налаштування. Далі докладніше про гему.

Devise- це ruby-гем, що надає можливості для аутентифікації в rails-додатках. Devise працює у зв'язці з гемом Warden, який у свою чергу надає сам механізм для автентифікації в rack-базованих ruby-додатках. Основні особливості Devise описані нижче:

  • заснований на Rack;
  • є закінченим MVC-рішенням, заснованим на Rails;
  • дозволяє вхід до системи за кількома моделями одночасно;
  • заснований на модульності: використовує тільки те, що вам дійсно потрібно.

Отже, приступимо до встановлення та налаштування Devise для вашого rails-додатку. Подальший процес для зручності читання буде розбитий на окремі кроки.Примітка: вся установка та налаштування мною проводилася для rails версії 4.0.1.

Крок 1.Додамо гем у Gemfile

Або із зазначенням точної версії (наступна версія у мене стабільно працює з rails 4.0.1)

Запустимо bundle для встановлення нових гемів

Як залежність будуть встановлені додатково такі геми:warden- сполучне ПЗ, що надає можливість аутентифікації для Rack-додатків;orm_adapter— надає єдину точку входу для використанняосновні функції Ruby ORMs;bcrypt-ruby— надає просту обгортку для роботи з паролями. В основі лежить криптографічна хеш-функція bcrypt();thread_safe- надає потоково-безпечні колекції та утиліти для Ruby;railties— внутрішні компоненти Rails, такі як завантажувачі програми, плагіни, генератори та rake-завдання.

Крок 2.Отже, гем був завантажений, але ще ніяк не взаємодіє з нашим додатком. Devise має у своєму арсеналі зручні генератори, одним із яких ми зараз і скористаємося. Виконаємо установку Devise шляхом запуску наступного генератора:

Цей генератор встановить ініціалізатор, в якому описані всі конфігураційні налаштування Devise, необхідні для роботи, а також файл базової локалі (англійська мова). Також установник запропонує нам виконати базове налаштування.

Крок 3.Зробимо базове налаштування гема після встановлення 3.1. Зараз нам необхідно задати налаштування мейлера (відправника пошти) для кожного із середовищ виконання. Для середовища розробки необхідно додати наступний рядок у файлconfig/environments/development.rb:

Для продакшн-середовища необхідно замінити значення ключа:hostна актуальне.

Думаю, ви зі мною погодитеся, що не дуже логічно після входу перенаправляти користувача на головну сторінку програми. У зв'язку з цим, налаштуємо перенаправлення після успішного входу на сторінку профілю користувача. Для цього додамо наступний маршрут уconfig/routes.rb:

Примітка: 1) Попередньо необхідно створити контролер та екшен. Це можна виконати через консоль за допомогою зручного генератора:

2) У результаті генератор створить контролерpersons_controllerз одним методом (екшеном)profile, а також вид для цього екшену. Список роутів можна отримати через консоль. Достатньо ввести команду:

У нашому випадку має бути доступний наступний роутер

для якого буде доступний хелперuser_root_path

Існує також інший шлях, за допомогою якого можна задати власні перенаправлення як після входу, так і після виходу. Для цього необхідно перевизначити вApplicationController(app/controllers/application_controller.rb) існуючі devise-методиafter_sign_in_path_forтаafter_sign_out_path_for. Особисто мені більше сподобався цей варіант налаштування перенаправлень:

Після входу користувач буде перенаправлений на сторінку, описану хелперомcurrent_user_path

Після виходу користувач залишиться на тій самій сторінці.

3.3. Необхідно до шаблону додати висновок повідомлень та попереджень

3.4. Якщо ви розгортаєте додаток наHerokuз використанням Rails версії 3.2, то потрібно додати наступний рядок уconfig/application.rb

3.5. Ми можемо налаштувати види файлів під свої потреби. Для цього необхідно їх скопіювати з гема у свої програми шляхом запуску наступної команди:

У директоріїapp/views/deviseви знайдете всі використовувані гемом файли видів. Можете налаштувати їх за своїм бажанням, під загальний стиль вашої програми.

Крок 4.Тепер настав час створити модель користувача, яка виконуватиме аутентифікацію. Ми генеруватимемо модель користувача, тому назвемо їїUser. Модель може також називатисяAdmin:

Даний генератор створить нову модель, якщо її не існувало раніше і конфігурує її з урахуванням модулів, що використовуються за замовчуванням. Швидше за все, ви отримаєтенаступний код уapp/models/user.rb(код дещо відформатований):

Devise має у своєму арсеналі 10 модулів. За промовчанням у вас буде підключено 6 модулів. Цей список можна відредагувати. Опис усіх доступних модулів наводжу нижче:

Також команда, яку ми виконали вище, створить файл міграції БД та роут. Файл міграції виглядає так:

Тут ми бачимо, що створюється таблиця користувачів (третій рядок коду). Оскільки ми назвали нашу модельUser, то таблиця має таку ж назву, але у множині (згідно з угодою за іменуваннямActiveRecord). Далі послідовно описуються поля, які будуть додані до таблиці під час створення. Як бачимо з коду, лише 6 модулям Devise до роботи можуть знадобитися поля таблиці.

У файліconfig/routes.rbбуде створено наступний маршрут:

Нагадаю, що список існуючих маршрутів можна переглянути за командою:

Крок 6.Далі обов'язково потрібно перезапустити додаток, щоб усі зміни набули чинності. Якщо цього не зробити, то можна зіткнутися з різними помилками. Оскільки моя програма працює під керуванням сервераUnicorn, то я перезапускаю саме його. Якщо ви тестуєте свою програму під серверомWebrick, достатньо буде зупинити його за допомогою комбінації клавішCTRL+C, а потім запустити заново:

Крок 7.Наш модуль та наш додаток готові до роботи. Наступним кроком буде додавання до шаблону посилань для входу та реєстрації. Це можна зробити так:

Список корисних методів-хелперів

Devise містить корисні хелпери, які можна використовувати всередині контролерів та видів. Деякі їх наводжу нижче.Перевірити факт входукористувача в систему можна за допомогою наступного хелпера:

Вивести електронну пошту користувача можна таким чином

Доступ до поточної сесії можна отримати так:

На цьому закінчу першу частину, а в наступній частині планую написати про інші не менш важливі і не менш цікаві налаштування цього чудового гема для аутентифікації.