четверг, 23 июля 2015 г.

Изучаем Devise 2: Аутентификация по номеру телефна

Это не обязательно должен быть номер телефона, это может быть username или еще что-нибудь. Но в дальнейшем планируется сделать подтверждение по номеру телефона с помощью SMS, по-этому здесь выбран именно номер телефона.

1) Вначале добавим колонку phone_number в таблицу users с помощью миграции:
rails g migration AddPhoneNumberToUsers phone_number:string:uniq:index
rake db:migrate
2) Внесем следующие изменения в модель (класс User):
  • Добавим опцию authentication_keys: [:login] в вызов метода devise:
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable,
             :validatable, :confirmable,
             authentication_keys: [:login]
  • Добавим поле login:
      def login=(login)
        @login = login
      end
    
      def login
        @login || self.phone_number || self.email
      end
    
  • Перегрузим метод отвечающий за поиск модели в базе данных:
      def self.find_for_database_authentication(warden_conditions)
        conditions = warden_conditions.dup
        if login = conditions.delete(:login)
          where(conditions.to_h).where(["lower(phone_number) = :value OR lower(email) = :value", { value: login.downcase }]).first
        else
          where(conditions.to_h).first
        end
      end
3) Добавим следующий код в контроллер ApplicationController:
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:phone_number, :email, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :phone_number, :email, :password, :remember_me) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:phone_number, :email, :password, :password_confirmation, :current_password) }
  end
Этот код указыает Devise какие поля формы следует сохранить в моделе. Для понимания этот код был бы аналогичен такому коду в контроллере SessionsController:
def sign_in
  permit_params = params.required(:user).permit(:phone_number,
    :email, :password, :password_confirmation)
  @user.attributes=permit_params
end
5) Далее нужно внести изменения в представления. По-умолчанию представления берутся из gem'а. Приведенная ниже команда генерирует представляения в вашем проекте. Они перегружают представления из gem'а:
rails generate devise:views
В форму регистрации (представление views/devise/registrations/new.html.erb) добавляем поле phone_number. Также вы можете добавить поле phone_number в представление редактирования данных пользователя views/devise/registrations/edit.html.erb. В форме аутентификации(представление views/devise/sessions/new.html.erb) заменяем поле email на поле login.

6) Не уверен обязательно ли это, но в config/initializers/devise.rb нужно желательно указать:
config.authentication_keys = [ :login ]
7) Перезапускаем сервер, пробуем.

Комментариев нет:

Отправить комментарий