繁体   English   中英

身份验证问题-无法识别“其他”-Ruby on Rails

[英]Authentication Problem - not recognizing 'else' - Ruby on rails

我似乎无法弄清楚我在做什么错。 我已经实现了Ryan Bates教程中的“ 超级简单身份验证” ,并且在登录部分正常运行的同时,我无法收到错误消息,并且无法正确登录以进行错误登录。

瑞安·贝茨(Ryan Bates)在评论中承认,他没有提及这一点,但似乎无法执行他的建议。 基本上发生的是,当某人正确登录时它可以工作。 输入错误的密码后,它将执行相同的重定向,并以“未成功登录”的方式闪烁显示(成功登录)。 管理员链接没有显示(这是正确的,并且链接受<%if admin?%>保护),但是我需要它说“失败的登录”并重定向到登录路径。 这是我的代码:

SessionsController

class SessionsController < ApplicationController
   def create
      if 
      session[:password] = params[:password]
      flash[:notice] = 'Successfully logged in'
      redirect_to posts_path
    else
      flash[:notice] = "whoops"
      redirect_to login_path
    end
  end

    def destroy
      reset_session
      flash[:notice] = 'Successfully logged out'
      redirect_to posts_path
    end
  end

ApplicationController的

class ApplicationController < ActionController::Base

  helper_method :admin?

  protected

  def authorize
    unless admin?
      flash[:error] = "unauthorized request"
      redirect_to posts_path
      false
    end
  end

  def admin?
    session[:password] == "123456"
  end

  helper :all # include all helpers, all the time
  protect_from_forgery # See ActionController::RequestForgeryProtection for details
  # 
end

您需要使用Ruby的比较运算符 ==而不是赋值运算符 = 您的 create操作应为:

 
 
 
  
  def create if session[:password] == params[:password] flash[:notice] = 'Successfully logged in' redirect_to posts_path else flash[:notice] = "whoops" redirect_to login_path end end
 
  


编辑:问题是您实际上没有在SessionsController中检查输入的密码与正确的密码。 将您的create方法更改为此:

def create 
  if params[:password] == '123456'
    session[:password] = params[:password]
    flash[:notice] = 'Successfully logged in' 
    redirect_to posts_path 
  else 
    flash[:notice] = "whoops" 
    redirect_to login_path 
  end 
end

像这样对密码进行硬编码并将其存储在会话中以供admin?使用是不理想的admin? helper方法,但这应该是超级简单的身份验证

    if  #YOU MISSING SOMETHING HERE WHICH Returns TRUE IF USER IS VALID
      session[:password] = session[:password]
      flash[:notice] = 'Successfully logged in'
      redirect_to posts_path
    else
      flash[:notice] = "invalid login"  #CHange if messaage for invalid login
      redirect_to login_path
    end

一定是

    if   session[:password] == params[:password]

您绝不会因以下原因而失败:

if session[:password] = session[:password]

这将永远是正确的。 您可能想要类似的东西:

if session[:password] == 'canihazpasswrd' then
  do_something_here

编辑 :请参阅@john的答案。 :)

尝试这个:

  def create
    if session[:password] == '123456'
      flash[:notice] = 'Succesfully logged in'
      redirect_to home_path
     else
      flash[:notice] = "Incorrect Password!"
      redirect_to login_path
    end
  end

关键是您使用的教程不进行用户身份验证。 它仅检查登录名是否属于管理员,因此将显示一些内容。

这样,您永远不会输入错误的登录名/密码,而只需输入admin / non-admin。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM