3

我有兩個用戶模型,首先是從遠程數據庫作爲遺留和公司內部的目的。 (員工登錄)。其次是我們的公共註冊和登錄項目,但我想要一個登錄表單。我搜索了很長時間,但有些解決方案讓我感到困惑。設計 - 從兩個模型登錄

一是傳統的樣子(僅用於讀取和驗證):

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
  • 設計1.4.3

編輯:

在設計的維基是一些關於多模型,但我有點困惑,沒有比較複雜的例子。

謝謝。

問候,瑞士雷達

+0

從這個線程http://stackoverflow.com/questions/7254431/devise-authentication-from-two-models我有一個想法它可能工作。但我不知道任何解決方案。以前沒人解決這個問題? – rado

回答

1

您應該devise/models/authenticatable.rb

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

猴補丁find_for_authentication方法關於身份驗證邏輯: 使用兩種模式針對你的情況驗證它是真的壞主意。你如何建立與兩個用戶模型的關係?這是很多不必要的代碼。

正確解決問題的方法是在你的表之間進行一些同步。

  • 嘗試使用基本用戶模型對用戶進行身份驗證。

  • 如果用戶憑據錯誤 - 嘗試使用CrmUser模型對其進行身份驗證。

  • 如果使用CrmUser進行身份驗證確定如果他已經不存在,請將其添加到用戶表

  • 返回用戶的模型對象。