Ruby on rails 筛选能够使用Desive登录的用户

Ruby on rails 筛选能够使用Desive登录的用户,ruby-on-rails,devise,Ruby On Rails,Devise,我有一个Rails应用程序,使用Desive进行身份验证。用户属于经销商,我希望阻止属于禁用经销商的用户登录 是否有一种简单的方法扩展Desive的身份验证查找程序,使其不包括来自已删除经销商的用户?可能对用户使用命名作用域 干杯 特里斯坦搜索Stackoverflow.com给了我这个问题/答案: 基本上,您必须在典狱长级别(Desive的基础)实施自定义身份验证策略。对于我的项目,我做了以下工作: 在config/initializers/designe.rb中: Devise.setup

我有一个Rails应用程序,使用Desive进行身份验证。用户属于经销商,我希望阻止属于禁用经销商的用户登录

是否有一种简单的方法扩展Desive的身份验证查找程序,使其不包括来自已删除经销商的用户?可能对用户使用命名作用域

干杯


特里斯坦搜索Stackoverflow.com给了我这个问题/答案:

基本上,您必须在典狱长级别(Desive的基础)实施自定义身份验证策略。对于我的项目,我做了以下工作:

config/initializers/designe.rb
中:

Devise.setup do |config|
  config.warden do |manager|
    manager.default_strategies(:scope => :user).unshift :user_has_login_access
  end
end

Warden::Strategies.add(:user_has_login_access) do
  def valid?
    # pass the commit parameter as 'login' or something like that, so that this strategy only activates when the user is trying to login
    params[:commit] == 'login' 
  end

  def authenticate!
    u = User.find_by_email(params[:user][:email])
    if u.can_login? # retrieves boolean value stored in the User model, set wherever
      success! u
    else
      fail! "Account does not have login privilages."
    end
  end
end
您可以在此处阅读更多有关自定义管理员策略的信息:


希望有帮助

我所需要做的就是覆盖我的用户模型的find\u for\u身份验证方法:

class User < ActiveRecord::Base
  ...

  # Intercept Devise to check if DealershipUser's Dealership is active
  def self.find_for_authentication(conditions)
    user = super
    return nil if user.is_a?(DealershipUser) && user.dealership.deleted?
    user
  end

  ...
end
class用户
  • 通过调用super以正常方式查找用户
  • 我正在使用STI,所以我检查用户是否是经销商用户,然后检查经销商是否被删除(表现为偏执)
  • 返回用户

  • 对于我的场景,这是一个非常具体的解决方案,但是您可以根据自己的喜好覆盖find_for_身份验证,只要您稍后返回用户。

    结果表明,我可以覆盖find_for_身份验证(见下文)。不过,谢谢你的回答,这可能对我正在处理的另一个问题有所帮助。