Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Аутентификация в Rails-приложениях с поддержкой Devise. Часть 1: базовая настройка

Anna | 20.06.2014 | нет комментариев

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

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

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

Выходит, приступим к установке и настройке Devise для вашего rails-приложения. Последующий процесс для удобочитаемости будет разбит на отдельные шаги.

Примечание: каждая установка и настройка мной производилась для rails версии 4.0.1.

Шаг 1. Добавим гем в Gemfile

gem 'devise'

Либо с указанием точной версии (дальнейшая версия у меня стабильно работает с rails 4.0.1)

gem 'devise', '3.2.2'

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

bundle install

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

Шаг 2. Выходит, гем был скачан, но еще никак не взаимодействует с нашим приложением. Devise имеет в своем арсенале комфортные генераторы, одним из которых мы теперь и воспользуемся. Исполним установку Devise путем запуска дальнейшего генератора:

rails generate devise:install

Данный генератор установит инициализатор, в котором описаны все конфигурационные настройки Devise, нужные для работы, а также файл с базовой локалью (английский язык). Также установщик предложит нам исполнить базовую настройку.

Шаг 3. Произведем базовую настройку гема позже установки
3.1. Теперь нам нужно задать настройки мейлера (отправщика почты) для всякой из сред выполнения. Для среды разработки нужно добавить следующую строку в файл config/environments/development.rb:

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

Для продакшн-среды нужно заменить значение ключа :host на актуальное.

3.2. Позже входа пользователя в систему, подтверждения аккаунта либо обновления пароля, Devise будет искать путь для дальнейшего перенаправления. По умолчанию он исполнит перенаправление кuser_root_path, если тот существует. В отвратном случае Devise исполнит перенаправление к root_path. Следственно данный путь должен быть непременно определен в приложении. Проверьте свой файл роутовconfig/routes.rb на присутствие строки дальнейшего вида:

root 'home#index'

Думаю, вы со мною согласитесь, что не дюже разумно позже входа перенаправлять пользователя на основную страницу приложения. В связи с этим, давайте настроим перенаправление позже удачного входа на страницу профиля пользователя. Для этого добавим дальнейший маршрут в config/routes.rb:

get 'persons/profile', as: 'user_root'

Примечание:
1) Заранее нужно сделать контроллер и экшен. Это дозволено исполнить через консоль с поддержкой комфортного генератора:

rails generate controller persons profile

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

bundle exec rake routes

В нашем случае должен быть доступен дальнейший роутер

user_root GET    /persons/profile(.:format)  persons#profile

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

Существует также и иной путь, с поддержкой которого дозволено задать личные перенаправления как позже входа, так и позже выхода. Для этого нужно переопределить в ApplicationController(app/controllers/application_controller.rb) существующие devise-способы after_sign_in_path_for иafter_sign_out_path_for. Лично мне, огромнее понравился данный вариант настройки перенаправлений:

def after_sign_in_path_for(resource)
  current_user_path
end

Позже входа пользователь будет перенаправлен на страницу, описанную хэлпером current_user_path

def after_sign_out_path_for(resource_or_scope)
  request.referrer
end

Позже выхода пользователь останется на той же странице.

3.3. Нужно в образец добавить итог уведомлений и предупреждений

<p><%= notice %></p>
<p><%= alert %></p>

3.4. Если вы разворачиваете приложение на Heroku с применением Rails версии 3.2, то необходимо добавить следующую строку в config/application.rb

config.assets.initialize_on_precompile = false

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

rails generate devise:views

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

Шаг 4. Сейчас подошло время сделать модель пользователя, которая будет исполнять аутентификацию. Мы будем генерировать модель пользователя, следственно назовем ее User. Модель может также именоватьсяAdmin:

rails generate devise User

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

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :o mniauthable
  devise :database_authenticatable,
         :registerable,
         :recoverable,
         :rememberable,
         :trackable,
         :validatable

end

Devise имеет в своем арсенале 10 модулей. По умолчанию у вас будет подключено 6 модулей. Вы можете отредактировать данный список. Изложение всех доступных модулей привожу ниже:

1. Database Authenticatable: предоставляет вероятность входа в систему на основе зашифрованного и хранимого в базе данных пароля. Вход может быть исполнен посредством отправки POST-запроса либо с поддержкой HTTP Basic Authentication.
2. Omniauthable: добавляет поддержку Omniauth (https://github.com/intridea/omniauth).
3. Confirmable: разрешает отправлять письмо с инструкциями для подтверждения аккаунта, сделанного во время регистрации.
4. Recoverable: разрешает восстанавливать позабытый пароль. Отправляет инструкции по поправлению на почту.
5. Registerable: управляет регистрацией пользователей, разрешает редактировать и удалять аккаунты.
6. Rememberable: разрешает запоминать пользователей на основе cookies. Управляет созданием и удалением токенов.
7. Trackable: ведет статистику числа входов, рассматривает время и IT-адреса.
8. Timeoutable: отвечает за длительность сессии активности пользователя в системе;
9. Validatable: предоставляет инструменты валидации e-mail и пароля. Модуль может быть легко настроен, вы можете определить личные валидаторы.
10. Lockable: блокирует аккаунт позже указанного в настройках число неудачных попыток авторизации. Аккаунт может быть разблокирован посредством email либо через определенный период времени.

Также команда, которую мы исполнили выше, сделает файл миграции БД и роут. Файл миграции выглядит дальнейшим образом:

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ''
      t.string :encrypted_password, :null => false, :default => ''

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0, :null => false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
  end
end

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

Если вы не используете какие-то из модулей, то не позабудьте закомментировать соответствующие поля в миграции. И, напротив, когда делаете какой-то из модулей энергичным, то также не позабудьте раскомментировать соответствующие строки.

В файле config/routes.rb будет сделан дальнейший маршрут:

devise_for :users

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

bundle exec rake routes

Шаг 5. Выходит, с модулями мы разобрались, нужные подключили, просмотрели файл миграции. Сейчас нужно исполнить миграцию, которая сделает таблицу пользователей с нужным комплектом полей. Исполним следующую команду:

bundle exec rake db:migrate

Шаг 6. Дальше непременно необходимо перезапустить приложение, Дабы все метаморфозы вступили в силу. Если этого не сделать, то дозволено столкнуться с разного рода ошибками.
Так как мое приложение работает под управлением сервера Unicorn, то я перезапускаю именно его. Если вы тестируете свое приложение под сервером Webrick, то довольно будет остановить его с поддержкой комбинации клавиш CTRL C, а после этого запустить снова:

rails server

Шаг 7. Наш модуль и наше приложение готовы к работе. Дальнейшим шагом будет добавление в образец ссылок для входа и регистрации. Это дозволено сделать дальнейшим образом:

<% if user_signed_in? %>
    <span>Здравствуйте, <%= current_user.email %></span>
    <%= link_to 'Выйти', destroy_user_session_path %>
<% else %>
    <%= link_to 'Войти', new_user_session_path %> либо <%= link_to 'Зарегистрироваться', new_user_registration_path %>
<% end %>

Если пользователь вошел на сайт, то пишем ему «Здравствуйте, [почта пользователя]» и рядом размещаем ссылку для выхода. Если пользователь еще не вошел на сайт, то располагаем рядом две ссылки «Войти» и «Зарегистрироваться». В качестве путей для ссылок используем существующие хелперы. Напомню, что маршруты были установлены в четвертом шаге и им список дозволено посмотреть по дальнейшей команде. Хелпер состоит из префикса (самая левая колонка ‘_path’)

bundle exec rake routes

Шаг 8. Самое время начать применять Devise по назначению — для ограничения доступа неавторизованному пользователю к определенным разделам сайта. Возможен, мы хотим позволить исполнять заказ лишь авторизованному пользователю. Для этого в соответствующий контроллер мы обязаны добавить фильтр:

class OrdersController < ApplicationController
  before_filter :authenticate_user!, except => [:show, :index]

  def index
    # do something
  end

  def show
    # do something
  end

  def create
    # do something
  end
end

Тут, в коде, вторым параметром в способ before_filter мы передает список способов контроллера, которые не обязаны фильтроваться. Таким образом, авторизация нужна только лишь для выполнения заказа (доступа к работе способа order). Если нужно фильтровать все способы контроллера, то 2-й параметр передавать не необходимо. Довольно лишь написать:

before_filter :authenticate_user!
Список пригодных способов-хэлперов

Devise содержит пригодные хэлперы, которые дозволено применять внутри контроллеров и видов. Некоторые из них привожу ниже.
Проверить факт входа пользователя в систему дозволено с поддержкой дальнейшего хэлпера:

user_signed_in?

С поддержкой дальнейшего хэлпера мы получим объект пользователя, авторизованного в данный момент на сайте

current_user

Вывести электронную почту пользователя дозволено дальнейшим образом

current_user.email

Доступ к нынешней сессии дозволено получить так:

user_session

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

Список применяемой литературы:

В качестве основного источника материала применялась официальная документация по гему —github.com/plataformatec/devise, дополненная собственным навыком настройки.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB