У нас есть приложение с несколькими тентовыми рельсами, которое очень близко напоминает подход «с нуля», который объясняет/учит Райан Бейтс.Администрирование приложения 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