设计 - 从两个模型登录

时间:2011-08-31 09:00:07

标签: ruby-on-rails authentication login devise ruby-on-rails-3.1

我有两个用户模型,第一个来自远程数据库作为遗留和内部公司目的。 (员工登录)。其次是我们的公共注册和登录项目,但我想要一个登录表单。我已经搜索了很长时间,但有些解决方案对我来说很困惑。

第一个遗产看起来像(仅用于阅读和身份验证):

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

编辑:

在Devise的wiki中有关于多个模型的东西,但我有点困惑,没有更复杂的例子。

谢谢。

此致,Rado

1 个答案:

答案 0 :(得分:1)

您应该find_for_authentication

中的monkeypatch devise/models/authenticatable.rb方法
module Devise
  module Models
    module Authenticatable
      def find_for_authentication(conditions)
          #put your authentication logic here
        end
    end
  end
end

关于身份验证逻辑: 在你的情况下使用两个模型进行身份验证,这真是个坏主意。你想如何与两个用户模型建立关系?这是很多不必要的代码。

解决问题的正确方法是在你的表之间进行一些同步。

  • 尝试使用基本用户模型对用户进行身份验证。

  • 如果用户凭据错误 - 请尝试使用CrmUser模型对其进行身份验证。

  • 如果使用CrmUser进行身份验证,则将他添加到用户表(如果他已经存在)。

  • 返回用户的模型对象。