开发者

Devise - login from two model

I have two user models, first is from remote database as legacy and for internal company pu开发者_如何学Crposes. (Employee logins). Second is our project for public registration and sign in but I want one login form. I have searching long time, but some solutions are confusing for me.

First legacy looks like (only for reading and authentication):

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

And second, for public and registration:

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

Now I don't know how to do that User controller try to authentication from first model, and when user doesn't exists, go to second model and try it again.

Using:

  • Rails 3.1
  • Devise 1.4.3

EDIT:

In wiki of Devise is something about multiple model, but I'm little bit confused, there are not example more complex.

Thank you.

Regards, Rado


You should monkeypatch find_for_authentication method from devise/models/authenticatable.rb

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

About authentication logic: Using two models for authentication in your case it's realy bad idea. How do u want build relations with two users models? It's a lot of unnecessary code.

Correct way of resolving your problem is make some synchronization between yours tables.

  • Try to authenticate user with base User model.

  • If user credentials was wrong - try to authenticate him with CrmUser model.

  • If authentication with CrmUser was OK add him to users table if he doesn't exists there already.

  • Return User's model object.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜