我正在尝试构建一个用于处理现有移动应用程序的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函数,但是它从未达到那行。
答案 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
不好,但是可以解决问题。而且,如果您不必重写设计的内幕,那么我就去做。
否则,您将不得不做
添加新的身份验证密钥以设计初始化程序
(在config/initializers/devise.rb
内添加config.authentication_keys = [:email, :username]
)
然后,您将不得不在find_for_database_authnetication
模型中覆盖User
才能通过用户名参数值搜索用户(选中https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L231)。因为在这种情况下alias_attribute
并没有真正帮助您
可能还有其他一些步骤
总而言之,肮脏的方法似乎更简单,更直接
编辑:
也许会有所帮助