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

7

我正在使用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个回答

1
我认为你的怀疑是正确的,find_tenant方法在身份验证之前被调用,导致admin_user_signed_in?为false。如果确实是这种情况,将其调整为使用after filter应该可以解决问题(来自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

虽然这篇文章已经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空间中,我做了以下操作:

在Active Admin控制器中设置多租户(Searchkick索引所需)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接