我正在尝试使用带有我已计算的用户名的设计创建登录。作为一个例子,我们假设我们想要命名我们的用户名 - 我想从登录表单接收用户名,并使用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
如何设计(特别是看守策略)来阅读新的参数?
答案 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