Как выполнить аутентификацию с помощью Devise при использовании нескольких моделей в приложении Rails 3.2

Я работаю над приложением Rails 3.2, где я использую Devise для аутентификации. Я решил попробовать наследование одной таблицы для управления ролями пользователей, но быстро столкнулся с проблемой. В настоящее время у меня есть три пользовательские модели: User < ActiveRecord, Admin < Userи Collaborator < User. Администратор и соавтор имеют общие столбцы пользователей, но их поведение и привилегии несколько различаются. Мои модели в настоящее время выглядят следующим образом:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :token_authenticatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :name, :password, :password_confirmation, :remember_me

  before_save :ensure_authentication_token

  [...]

end

class Admin < User
  has_one :account, dependent: :destroy 
  attr_accessible :account_attributes 
  accepts_nested_attributes_for :account
end


class Collaborator < User
  has_one :account
end

class Account < ActiveRecord::Base
  attr_accessible :name
  validates_presence_of :name 
  has_many :projects, dependent: :destroy
  has_many :users
end

Проблема возникает, когда я пытаюсь аутентифицировать администраторов и соавторов в моем ProjectController (и других контроллерах, где мне нужна аутентификация):

# Causes problem, no one can access anything.
before_filter :authenticate_admin!
before_filter :authenticate_collaborator!

Похожая проблема у меня была с вспомогательными методами devise для ie. текущий_пользователь, теперь у меня есть текущий_администратор и текущий_сотрудник, я "решил" это, создав предварительный фильтр и метод:

def set_current_user
  @current_user = current_admin || current_collaborator
end

Есть ли похожее или простое решение для моей проблемы аутентификации с Devise, или вы бы порекомендовали другой подход, кроме наследования одной таблицы, и что бы это было?

Моя цель: 1. когда новые пользователи регистрируются, они становятся администраторами, когда они создают свою учетную запись, также создается модель учетной записи. 2. Новый пользователь (Администратор)может затем пригласить дополнительных пользователей в учетную запись, которые будут соавторами. 3. Администраторы и соавторы должны иметь разные привилегии. Соавторы не будут создавать новые «Учетные записи» при регистрации (Компания может быть лучшим названием для моей модели Учетной записи), поэтому администратору и соавторам потребуются несколько разные формы для регистрации и редактирования.

Спасибо.

Обновление

Я как бы "решил" эту проблему, создав аналогичный предварительный фильтр.:

def authenticate!
  if @current_user == current_admin
    :authenticate_admin!
  elsif @current_user == current_collaborator
    :authenticate_collaborator!
  end
end

Предложения по возможно более элегантным решениям все же будут оценены.

11
задан Anders 22 April 2012 в 17:03
поделиться