使用多个用户名设置3.4.1并重置密码forbiddenAttributesError

时间:2014-11-24 19:06:09

标签: ruby-on-rails-4 devise

我的用户模型中有多个可能的用户名,即用户可以使用其中任何一个登录。 这是基于这里的文章:https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address

使用任一代码实际登录都正常,但是按照示例我无法正常启动重置密码页面。

这是一个多租户方案,因此还需要考虑account_id。 我发现很多其他人都有同样的问题 - 但如果我允许,我不知道解决这个问题的正确方法是什么!在相关方法(下面)中,然后重置密码功能,但标准登录不再有效。

我收到ForbiddenAttributesError如下:

  ActiveModel::ForbiddenAttributesError - ActiveModel::ForbiddenAttributesError:
  activemodel (4.1.6) lib/active_model/forbidden_attributes_protection.rb:21:in `sanitize_for_mass_assignment'
  activerecord (4.1.6) lib/active_record/relation/query_methods.rb:568:in `where!'
  activerecord (4.1.6) lib/active_record/relation/query_methods.rb:559:in `where'
  activerecord (4.1.6) lib/active_record/querying.rb:10:in `where'
  app/models/user.rb:356:in `find_first_by_auth_conditions'
  devise (3.4.1) lib/devise/models/authenticatable.rb:266:in `find_or_initialize_with_errors'
  devise (3.4.1) lib/devise/models/recoverable.rb:115:in `send_reset_password_instructions'
  devise (3.4.1) app/controllers/devise/passwords_controller.rb:13:in `create'

User.rb

 devise :database_authenticatable, :recoverable, :rememberable, :trackable, authentication_keys: [:login, :account_id], reset_password_keys: [:login, :account_id]

....

  def self.find_first_by_auth_conditions(warden_conditions)

    # IF i switch these 2 lines then reset password works BUT normal login doesn't
    #conditions = warden_conditions.dup.permit!
    conditions = warden_conditions.dup

    if login = conditions.delete(:login)
      where(conditions).where(["lower(remote_id) = :value OR lower(other_id) = :value", { :value => login.downcase }]).first
    else
      where(conditions).first
    end
  end

application_controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

...

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:remote_id, :email, :password, :password_confirmation, :remember_me) }
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :remote_id, :email, :password, :remember_me) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:remote_id, :email, :password, :password_confirmation, :current_password) }
end

使用设计3.4.1,rails 4.1.6

0 个答案:

没有答案