2012-11-27 51 views
1

我们有一个多帐篷导轨应用程序,它非常类似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) } 

我questino是:什么是管理用户应用宽..意思User.scoped User.unscoped的最佳方式?

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

(帐户中的新动作也建立了一个用户,并创建一个用户帐户)

#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 

回答

1

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