使用计算/操作的用户名参数

时间:2016-11-09 16:52:26

标签: ruby-on-rails authentication devise ruby-on-rails-5 warden

我正在尝试使用带有我已计算的用户名的设计创建登录。作为一个例子,我们假设我们想要命名我们的用户名 - 我想从登录表单接收用户名,并使用namespaced_username进行实际身份验证。

所以在我的User::SessionsController#create中,我可能会:

def create
  params[:user][:namespaced_username] = "namespace/#{params[:user][:mobile_number]}"
  super
end

即使设计正在侦听namespaced_username(在初始化程序或模型本身中配置了authentication_keys),并且用户设置为namespace/username,我仍然会被告知Invalid Namespaced username or password is not valid

如何设计(特别是看守策略)来阅读新的参数?

1 个答案:

答案 0 :(得分:0)

事实证明这是一个Rails 5问题。基本上,Warden(由设计使用)被传递给请求对象,可能是在中间件中,然后控制器被传递给请求的params散列的副本。

解决问题的简便方法是,在User::SessionsController#create内,我们需要添加一行:

def create
  # Here we change params - but this won't be seen by the warden strategy
  params[:user][:namespaced_username] =  = "namespace/#{params[:user][:mobile_number]}"
  # Inject our changes into the copy in request
  request.params[:user].merge!(params[:user])
  # now our changes will be seen by warden - continue with devise:
  super
end