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