ActiveAdmin中的多租户,多管理员用户

时间:2012-07-11 19:32:21

标签: ruby-on-rails devise activeadmin multi-tenant

我正在构建一个以ActiveAdmin作为主管理界面的多租户应用。我已经使用acts_as_tenant gem来很好地分离数据。

我已将AdminUser模型用作所有用户的用户模型对象。

为了添加其他用户,AdminUser也作为租户的范围。

这会抛弃登录,因为当ActiveAdmin / Devise尝试进行身份验证时,我认为它首先点击了find_tenant过滤器,如下所示:

class ApplicationController
  set_current_tenant_through_filter

  before_filter :find_tenant

  def find_tenant
     if admin_user_signed_in?
      set_current_tenant(Company.find(current_admin_user.company_id))
     end
  end

不确定如何解决这个问题...我希望用户登录,然后应用程序从登录用户获取company_id并设置租户,ActiveAdmin上显示的所有数据都通过该租户确定范围(此部分有效)如果我能通过登录,那么通过acts_as_tenant gem。

由于

2 个答案:

答案 0 :(得分:0)

我认为您的怀疑是正确的,并且在身份验证之前调用了find_tenant方法,导致admin_user_signed_in?是假的。如果情况确实如此(来自http://guides.rubyonrails.org/action_controller_overview.html#after-filters-and-around-filters),那么调整它以使用后过滤器应该可以做到这一点。

class ApplicationController
  set_current_tenant_through_filter

  after_filter :find_tenant

  def find_tenant
    if admin_user_signed_in?
      set_current_tenant(Company.find(current_admin_user.company_id))
    end
  end

不确定set_current_tenant_through_filter如何适用于所有这些,你是否试图以两种不同的方式做同样的事情?

答案 1 :(得分:0)

8岁的帖子,但是回旋路...我像这样设置routes.rb

  devise_for :admin_users, ActiveAdmin::Devise.config
  require 'sidekiq/web'
  Sidekiq::Web.set :sessions, false
  authenticate :admin_user do
    mount Sidekiq::Web => '/admin/sidekiq'
  end

在我的情况下,我的非管理员用户拥有company_id,我认为您需要这样做:

  def find_tenant
    if user_signed_in?
      set_current_tenant(Company.find(current_admin_user.company_id))
    end
  end

在AA空间中,我这样做了:

Set Multi Tenant in Active Admin Controllers (required for Searchkick index)

我仅在更新AA中的记录时设置租户。我之所以这样做是因为Searchkick索引的要求。在您的情况下,您可能只需要允许company_id参数。