覆盖Devise SessionsController#Create和创建视图-身份验证失败

时间:2018-12-17 04:47:26

标签: ruby-on-rails devise

我有一个从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提供的原始视图代码上的参数名称,并且似乎将感兴趣的参数称为“电子邮件”和“密码”,因此对我而言,这里出了什么问题不是很明显。

感谢您的帮助。

2 个答案:

答案 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%>