Разработать - войти из двух моделей - PullRequest
3 голосов
/ 31 августа 2011

У меня есть две пользовательские модели, первая из удаленной базы данных как устаревшая и для внутренних целей компании.(Логины сотрудников).Во-вторых, это наш проект для публичной регистрации и входа, но я хочу одну форму входа.Я долго искал, но некоторые решения сбивают меня с толку.

Первое наследие выглядит так (только для чтения и аутентификации):

class CrmUser < ActiveRecord::Base

  require Rails.root.join('lib', 'devise', 'encryptors', 'sha1')
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable, :rememberable, and :omniauthable
  establish_connection "crm_data"
  set_table_name :users

  devise :database_authenticatable, :encryptable, :authentication_keys => [:login]
  alias_attribute :encrypted_password, :crypted_password
  alias_attribute :password_salt, :salt

  # Setup accessible (or protected) attributes for your model
  attr_accessible :login, :password, :password_confirmation, :remember_me, :role_id, :first_name, :last_name

И второе, для публики и регистрации:

class User < ActiveRecord::Base

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable, :rememberable, and :omniauthable
  devise :database_authenticatable, :registerable, :authentication_keys => [:login]
  alias_attribute :login, :email

  # Setup accessible (or protected) attributes for your model
  attr_accessible :login, :password, :password_confirmation, :remember_me, :role_id, :first_name, :last_name

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

Использование:

  • Rails 3.1
  • Devise 1.4.3

EDIT:

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

Спасибо.

С уважением, Радо

1 Ответ

1 голос
/ 21 ноября 2011

Вы должны monkeypatch find_for_authentication метод из devise/models/authenticatable.rb

module Devise
  module Models
    module Authenticatable
      def find_for_authentication(conditions)
          #put your authentication logic here
        end
    end
  end
end

О логике аутентификации: использование двух моделей для аутентификации в вашем случае - это действительно плохая идея.Как вы хотите построить отношения с двумя моделями пользователей?Это много ненужного кода.

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

  • Попробуйте аутентифицировать пользователя с помощью базовой модели User.

  • Если учетные данные пользователя были неверны - попробуйте аутентифицировать его с моделью CrmUser.

  • Если аутентификация с CrmUser прошла нормально добавьте его в таблицу пользователей если он там уже не существует.

  • Возвращает объект модели пользователя.

...