1

我们有一个多租户 Rails 应用程序,它非常类似于 Ryan Bates 解释/教授的“从头开始”方法。

从头开始进行身份验证。

从头开始的多租户。

我们有一个帐户模型,它具有子域属性并使用范围来分隔数据。

#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) }

我的问题是:在整个应用程序范围内管理用户的最佳方式是什么……意思是 User.scopedUser.unscoped?

首先想到的是在 User 模型中添加一个 admin_password 属性。使用环境变量设置密码,并在创建用户/帐户时将管理员密码值添加到隐藏字段中。

(帐户新操作也建立一个用户并创建一个用户帐户)

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

我看到这种方法的最大问题是身份验证。我需要重写一些东西,以便如果 admin_password 正确,则不会检查正常的密码属性。如果 admin_password 不正确,将使用密码属性。

附带说明一下,我查看了诸如 act_as_tenant 和 devise 之类的插件,但我更愿意自己构建这些部分。

我可能在这里走错了路,这就是为什么我要求推荐的解决方案/想法。提前谢谢你的那些:)

#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
4

1 回答 1

1

我使用 cancan gem 解决了这个问题,并在帐户创建操作中创建了一个管理员用户。

于 2012-11-28T15:48:00.890 回答