Я работаю над приложением 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
Предложения по возможно более элегантным решениям все же будут оценены.