2012-11-27 2 views
1

У нас есть приложение с несколькими тентовыми рельсами, которое очень близко напоминает подход «с нуля», который объясняет/учит Райан Бейтс.Администрирование приложения Multi-Tenant Rails

Аутентификация с нуля.

Многоквартирный дом с нуля.

У нас есть модель учетной записи, которая имеет атрибут поддомена и использует область охвата для разделения данных.

#ApplicationController 
around_filter :scope_current_account 

private 

    def current_account 
    if request.subdomain.present? && request.subdomain != 'www' && request.subdomain != 'ndt-staging' 
     @account ||= Account.find_by_subdomain!(request.subdomain) 
    end 
    end 
    helper_method :current_account 

    def scope_current_account 
    if request.subdomain.present? && request.subdomain != 'www' && request.subdomain != 'ndt-staging' 
     Account.current_id = current_account.id 
    end 
    yield 
    ensure 
    Account.current_id = nil 
    end 

Модель:

#Account.rb 
has_many :users, :inverse_of => :account, :dependent => :destroy 

#User.rb 
belongs_to :account, :inverse_of => :users 
default_scope { where(account_id: Account.current_id) } 

Мой questino: Что является лучшим способом для управления пользователями применения широких .. смысл User.scoped и User.unscoped?

Первое, что приходит на ум - добавить атрибут admin_password к модели пользователя. Задайте пароль с переменной окружения, а при создании Пользователя/учетной записи добавьте значение пароля администратора в скрытое поле.

(счет новых действий также создает пользователя и создает учетную запись пользователя)

#AccountsController 
def new 
    @account = Account.new 
    @account.users.build(params[:user]) 
end 

Самая большая проблема, которую я вижу с этим подходом является аутентификация. Мне нужно будет перезаписать вещи так, чтобы, если admin_password верен, нормальный пароль не будет проверен. Если admin_password неверно, будет использоваться атрибут пароля.

В качестве примечания, я рассмотрел плагины как act_as_tenant и разработал, но сам построил бы эти части.

Я мог бы пойти по неверному пути здесь, поэтому я прошу рекомендовать решения/идеи. Спасибо заранее за те :)

#SessionsController 
def create 
    user = User.find_by_email(params[:email].downcase) 
    if user && user.authenticate(params[:password]) 
    sign_in user 
    redirect_to welcome_path 
    else 
    flash.now[:error] = 'Invalid email/password combination' # Not quite right! 
    render 'new' 
    end 
end 

ответ

1

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

Смежные вопросы