【问题标题】:Conditional display based on devise authentication status基于设备认证状态的条件显示
【发布时间】:2014-12-19 00:33:30
【问题描述】:

我使用的是 Devise 3.4.0、Rails 4.1.8。

一旦用户点击sessions#new,输入他们的用户名和密码,然后点击“登录”按钮,设计发布到/users/sign_in。如果身份验证成功,用户将被重定向。但是,如果身份验证失败,我需要在视图中做一些不同的事情。基本上,我们有两种类型的帐户:传统帐户和现代帐户。

现代帐户没问题:它们来自我们的 Rails 系统,所以我们知道错误的登录就是错误的登录。他们肯定有一个帐户,他们只是使用了错误的密码。我想在 Flash 消息(我也在使用)之外向他们显示额外的帮助文本。

但是,我们已将旧帐户导入我们的系统;我们只是没有给他们分配密码。如果他们尝试使用旧帐户登录,我想显示相同的 Flash 消息,但在 Flash 消息之外显示不同的帮助文本。

我正在寻找这样的东西(如果逻辑在视图中;坚持我一分钟)。看到最后的两个条件了吗?

<div class="login_form">
  <div class="flash">
    <%= render partial: 'layouts/flash_messages', locals: { flash_messages: flash } %>
  </div>

  <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
    <%= f.email_field :email, autofocus: true, placeholder: "Email" %>
    <%= f.password_field :password, placeholder: "Password" %>
    <%= f.button "Sign in" %>
  <% end %>

  <% if gave_wrong_password? %>
    <a href="/def456">Reset your password here!</a>
  <% elsif no_account_exists? %>
    <a href="/abc123">Create a new account here!</a>
  <% end %> 
</div>

基本上,我需要 Devise(或 Warden)来告诉我失败的原因。是否有可供我使用的 Devise 控制器获取信息?

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    你能做的就是像这样设计模型

    #app/controllers/users/sessions_controller.rb
    
    class Users::SessionsController < Devise::SessionsController
      layout 'users/login'
    
      before_filter :before_signin, :only => [:create]
      after_filter :after_signin, :only => [:create]
    
      def new
        self.resource = resource_class.new(sign_in_params)
        clean_up_passwords(resource)
        respond_with(resource, serialize_options(resource))
      end
    
      def create
        self.resource = warden.authenticate!(auth_options)
        #set_flash_message(:notice, :signed_in) if is_flashing_format?
        sign_in(resource_name, resource)
        yield resource if block_given?
        if session[:user_return_to]
          respond_with resource, :location => session[:user_return_to]
        else
          respond_with resource, :location => after_sign_in_path_for(resource)
        end
      end
    
      private
      def after_sign_in_path_for(resource)
        users_root_path
      end
    
      def after_sign_out_path_for(resource_or_scope)
        new_user_session_path
      end
    
      def before_signin
        # do something
      end
    
      def after_signin
        # do something
      end
    end
    

    【讨论】:

    • 谢谢!几乎就在那里:这给了我一种方法来检查用户是否存在或者是旧用户(我可以在before_signin 中进行查询并设置一个我可以在我的视图中使用的实例变量)但是我如何判断是否进行了身份验证尝试因密码错误而失败?
    • 我想我已经通过检查几个不同的州而不是与 Warden 战斗找到了解决方法。这个答案让我开始了,所以我会接受它。再次感谢!
    • 谢谢我。很高兴这为您指明了方向。正确的方向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多