Вопрос о мультитенантном дизайне приложений / архитектуре - PullRequest
0 голосов
/ 16 мая 2019

Я создаю приложение, которое использует Apartment для многопользовательской аренды и Devise для аутентификации пользователей.

Сначала создается экземпляр Tenant, затем он перенаправляется на subdomain.lvh.me/users/sign_up, чтобы пользователь мог зарегистрироваться и быть частью схемы только для этого конкретного субдомена.Таким образом, пользователи могут авторизоваться только на том поддомене, на котором они изначально зарегистрированы, что я и хочу.Это также было выгодно, потому что я назначил каждому пользователю с id = 1 значение admin, поэтому каждый раз, когда создается новый клиент, он перенаправляет на поддомен, и первым зарегистрированным пользователем будет администратор по умолчанию (имеет смысл, потому что пользователь начинает сцелевую страницу, создайте учетную запись компании (арендатора), а затем сразу после этого создайте учетную запись пользователя с его именем, адресом электронной почты, паролем и т. д., и они будут первым пользователем, связанным с этим арендатором, и, следовательно, будут администратором по умолчанию.

Это сработало хорошо, потому что человек, пришедший с целевой страницы (представьте себе руководителя команды - директора по маркетингу или чего-то еще), мог подписаться на продукт и установить информацию о компании, а также стать первым пользователем с возможностями администратора.команда будет регистрироваться на поддомене и не будет авторизована для входа на другом поддомене, или им придется зарегистрироваться на целевой странице, и в этом случае к ним будет относиться как к регистрации новой компании, а не просто к пользователю.

НедавноЯ реализовал вложенные атрибуты, чтобы можно было завершить начальный процесс регистрации только в одной форме / представлении вместо двух.Проблема в том, что экземпляр User создается в контроллере Tenant, он не является частью схемы для дочернего домена компании и поэтому не может войти в систему на subdomain.lvh.me/users/sign_in.

IМне интересно, сталкивался ли кто-нибудь с этой проблемой раньше и каким было ваше решение.Было бы лучше изменить его обратно на первоначальный, создав сначала Tenant, перенаправив на поддомен / sign_up, а затем создав первого пользователя?

Извините, если я не сформулировал это так хорошо, как мог бы.

Я пытался перенаправить на поддомен перед вызовом @tenant.users.build, но это не сработало, как я думал.

часть tenants_controller.rb

def new
    @tenant = Tenant.new
    @tenant.users.build
    render layout: false
end

def create
    @tenant = Tenant.new(tenant_params)
    @tenant.update_attribute :subdomain, @tenant.company.downcase
    respond_to do |format|
      if @tenant.save 
        format.html { redirect_to "http://#{@tenant.subdomain}.lvh.me:3000/users/sign_in", notice: 'Domain was successfully created.' }
        #format.html { redirect_to new_user_registration_path, notice: 'Tenant was successfully created.' }
        format.json { render :show, status: :created, location: @tenant }
      else
        format.html { render :new }
        format.json { render json: @tenant.errors, status: :unprocessable_entity }
      end
   end
end

1 Ответ

0 голосов
/ 17 мая 2019

Я не уверен, как настроено ваше приложение и квартира. Я установил, что арендатор (в моем случае рабочее пространство) принадлежит владельцу (его класс - Пользователь). Вот выдержка.

Контроллеры / workspace_controller.rb

class WorkspacesController < ApplicationController
  def new
    @workspace = Workspace.new
    @workspace.build_owner
  end

  def create
    @workspace = Workspace.new(workspace_params)
    respond_to do |format|
      if @workspace.valid?
        Apartment::Tenant.create(@workspace.subdomain)
        Apartment::Tenant.switch(@workspace.subdomain) do
          @workspace.save
        end
        format.html { redirect_to new_user_session_url(subdomain: @workspace.subdomain), notice: t("flash.controllers.#{controller_name}.#{action_name}.success") }
      else
        format.html { render :new }
      end
    end
  end
end

Модели / workspace.rb

class Workspace < ApplicationRecord
  belongs_to :owner, class_name: 'User', required: true
  accepts_nested_attributes_for :owner
end

Форма построена с полями рабочей области и владельца. Если проверка прошла успешно, создается новая схема с Apartment::Tenant.create(@workspace.subdomain). Затем мы завернем фактическое создание арендатора в квартиру переключатель Apartment::Tenant.switch(@workspace.subdomain) do … Все в этом блоке будет сохранено в схеме subdomain, за исключением того, что вы присвоили config.excluded_models в вашей конфигурации квартиры. В моем случае пользователь сохраняется в 'subdomain'.'users', а рабочее пространство - в public.'workspaces'.

Не задавайте жестко ваш адрес перенаправления. Вы можете передать поддомен URL-помощнику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...