登录前对列进行设计检查

时间:2016-01-01 21:26:09

标签: ruby-on-rails devise

我正在制作一个多租户应用,并希望在开始会话之前检查用户是否属于当前帐户。

我已经有一个名为" account_id"在用户模型中。

所以我需要知道的是检查User.account_id = current_tenant.id

有人可以告诉我该怎么做吗?

2 个答案:

答案 0 :(得分:1)

如果我理解您的要求是正确的,那么您需要做的就是在config.request_keys = [:subdomain]中设置initializers/devise.rb

或者,如果您使用多个模型并且不希望将其应用于所有模型,则可以直接在模型上进行设置:

devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, request_keys: [:subdomain]

然后你可以用以下内容覆盖find_for_database_authentication

def self.find_for_database_authentication(conditions)
  current_tenant = Account.find_by_subdomain(conditions[:subdomain])
  where(email: conditions[:email], account_id: current_tenant.id).first
end

答案 1 :(得分:0)

我一直在研究类似的功能,虽然尚未对其进行排序。

简而言之,您正在查看authentication scoping

这是,您确定围绕用户if(move_uploaded_file($_FILES["fupload"]["tmp_name"][$f], $path.$name)) { $count++; mysql_query("INSERT INTO product(id, product_name, image) VALUES ('$id','$_POST[productname]', '$name')");} 的登录信息:

  • 仅当account_id对象是不同对象的依赖
  • 时才能进行登录
  • 不同的对象(在您的情况下)是user
  • 因此,您首先需要确保您可以访问account(通过account_id),然后使用自定义subdomain策略验证user ... < / LI>

-

根据Devise&#39;自述文件,您应该能够覆盖Warden方法,但这只会验证用户是否存在特定数据...也许您可以使用它:

find_for_authentication

这将是#app/models/user.rb class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, request_keys: [:subdomain] #-> request key being a key from the "request" hash (request.subdomain) def self.find_for_authentication(warden_conditions) account = Account.find(warden_conditions[:subdomain]) #-> not sure where(email: warden_conditions[:email], account_id: account.id).first end end 的范围,但不会验证该帐户是否有效。

为此,您需要使用自定义account_id策略:Good ref

我可以更新我为监狱长策划所做的事情,但我还没有让它正常工作。