1

Ryan Bates が説明/教えている「ゼロから」のアプローチに非常によく似たマルチテナント 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) }

私の質問は次のとおりです。ユーザーアプリケーション全体を管理する最良の方法は何ですか..つまり、User.scopedおよびUser.unscoped?

最初に頭に浮かぶのは、User モデルに admin_password 属性を追加することです。環境変数でパスワードを設定し、ユーザー/アカウントの作成時に管理者パスワードの値を隠しフィールドに追加します。

(アカウントの新しいアクションもユーザーを作成し、ユーザー アカウントを作成します)

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

このアプローチで私が目にする最大の問題は、認証です。admin_password が正しい場合、通常のパスワード属性がチェックされないように、書き直す必要があります。admin_password が正しくない場合、パスワード属性が使用されます。

補足として、acts_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 に答える