我有一个从devise登录视图改编的用户登录页面,并且我要覆盖控制器,因为我需要在登录时执行多个任务,但是我无法越过步骤1(管理员身份验证)。
内部用户:: SessionController <设计人员:: SessionsController,我只是拥有
def create
super
[...other post authentication code]
end
调试到super.create我可以看到它调用了
self.resource = warden.authenticate!(auth_options)
,但从调用super到永远都不会恢复。监狱长以某种方式进行身份验证!调用似乎劫持了create方法,最终重新渲染了登录页面。
我看到auth_options参数仅包含一个哈希:
=> {:scope=>:user, :recall=>"users/sessions#new"}
也许那里出了点问题,因为我原本以为需要以某种方式传递电子邮件和密码,但是Warden还是有点神秘,不能真正确定那些auth选项中应该包含什么。因此,我不太了解正在认证的内容,但是看守无论如何对我来说都是一个谜。
这是create方法要经过的params集合。
<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"EJ[...]mA==",
"email"=>"joe@gmail.com", "password"=>"Qrxt5d3", "commit"=>"Log in", "controller"=>"users/sessions", "action"=>"create"}
permitted: false>
我可以使用确认密码正确 user.valid_password?(“ Qrxt5d3”)
我检查了gem提供的原始视图代码上的参数名称,并且似乎将感兴趣的参数称为“电子邮件”和“密码”,因此对我而言,这里出了什么问题不是很明显。
感谢您的帮助。
答案 0 :(得分:0)
显然,问题在于,当身份验证失败时,warden.authenticate!(auth_options)会进行某种形式的立即重定向到new。
在我的情况下,身份验证失败的原因是因为我的模型中具有:confirmable且尚未确认用户名。从用户模型中删除该密码,然后身份验证成功。
((我本以为进行身份验证!可能会引发错误或在失败时返回false或其他信息,但它只会重定向到:new。
答案 1 :(得分:0)
尝试一下,这对我来说很好!
devise_for :users, controllers: { sessions: 'users/sessions',
registrations: 'users/registrations'
}
app \ controllers \ users \ sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
def create
@admin = User.find_by(email:params["session"]["email"])
if @admin.valid_password?(params["session"]["password"])
sign_in(:user, @admin)
redirect_to root_path
else
flash[:error] = "Invalid Password."
redirect_back(fallback_location: root_path)
end
end
end
app \ views \ users \ sessions \ new.html.erb
<%= form_for :session, url: user_session_path do |f| %>
<%= f.email_field :email%>
<%= f.password_field :password%>
<%= f.submit'login'%>
<%end%>