允许使用Alias_attribute登录

时间:2019-07-06 18:05:23

标签: ruby-on-rails devise warden

我正在尝试构建一个用于处理现有移动应用程序的API。移动应用使用用户名,但实际上只是电子邮件,而不是重新设计以使用户名混乱的系统确实是电子邮件。我想使用alias_attribute。它似乎适用于除登录之外的所有内容。 JSON显示为

{ "username":"test12345@gmail.com", "password":"password" }

我允许钥匙 devise_parameter_sanitizer.permit(:sign_in, keys: [:username, :password]) 但失败于 self.resource = warden.authenticate!(auth_options) 看守似乎正在忽略alias_attribute。如果我将用户名更改为电子邮件,则可以正常工作。我尝试覆盖模型上的数据库auth函数,但是它从未达到那行。

1 个答案:

答案 0 :(得分:0)

据我所知,覆盖默认的session_controller行为更容易

您内部的会话控制器:

def create
  if params[:user][:username]
    params[:user][:email] = params[:user][:username]
  end
  super
end

或者如果您不想重写create方法,请添加

before_action :override_params, only: :create

def override_params
  if params[:user][:username]
    params[:user][:email] = params[:user][:username]
  end
end

不好,但是可以解决问题。而且,如果您不必重写设计的内幕,那么我就去做。

否则,您将不得不做

  1. 添加新的身份验证密钥以设计初始化程序 (在config/initializers/devise.rb内添加config.authentication_keys = [:email, :username]

  2. 然后,您将不得不在find_for_database_authnetication模型中覆盖User才能通过用户名参数值搜索用户(选中https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L231)。因为在这种情况下alias_attribute并没有真正帮助您

  3. 可能还有其他一些步骤

总而言之,肮脏的方法似乎更简单,更直接

编辑:

也,请检出此页面https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-using-their-username-or-email-address

也许会有所帮助