【问题标题】:Authentication Problem - not recognizing 'else' - Ruby on rails身份验证问题 - 无法识别“其他” - Ruby on rails
【发布时间】:2011-02-13 09:39:08
【问题描述】:

我似乎无法弄清楚我在这里做错了什么。我已经实现了 Ryan Bates 教程中的 Super Simple Authentication,当登录部分正常运行时,我无法收到错误消息并重定向以正确发生登录错误。

Ryan Bates 在他的 cmets 中承认他忽略了这一点,但似乎无法实施他的建议。基本上发生的事情是,当有人正确登录时,它就可以工作。当输入错误的密码时,它会执行相同的重定向并闪烁“成功登录”,以为他们不是。管理员链接不显示(这是正确的,链接是否受 保护)但我需要它说“登录失败”并重定向到登录路径。这是我的代码:

会话控制器

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

应用控制器

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

【问题讨论】:

  • 只是一个错字吗? 'if' 关键字后面不应该有换行符吗?
  • 尝试将会话[密码] 移动到同一行,但没有成功。
  • 您好。如果 session[:password] = session[:password] 或者您的代码乱码,您的代码是否会读取?
  • 应该是 == not = if session[:password] == params[:password] then ...
  • 所以添加 == vs = 也不起作用。

标签: ruby-on-rails ruby session


【解决方案1】:

你需要使用 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? 辅助方法使用并不理想,但这应该是超级简单的身份验证

【讨论】:

  • 嗨,约翰,这似乎也不起作用。即使没有,仍然会重定向并闪烁“成功登录”。
  • 感谢您更正我在标题中的错字。
  • 完美,效果很好。我知道这不是一个好方法,但想确保我在继续之前了解这一切是如何工作的。接下来我可能会安装 gem clear。感谢您的帮助。
  • 没问题,我很高兴它成功了。这种方法适用于简单的东西,但您可能不想使用它来构建在线银行应用程序! ;-)
【解决方案2】:
    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]

【讨论】:

  • 是的,我有一个错字。即使进行了更改,仍然无法正常工作。
【解决方案3】:

您永远不会因为以下原因而出现失败情况:

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

这将永远是正确的。你可能想要这样的东西:

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

【讨论】:

  • 我认为你这里有一个错字。如果已经存在,那么在会话中设置密码有什么意义?
【解决方案4】:

编辑:参考@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? 方法应该通过将会话中存储的密码与已知的正确密码进行比较来返回用户是否是管理员。您不能像 create 方法那样在 if 语句中使用赋值运算符。
  • 抱歉打错了。我从问题中复制粘贴! :P
【解决方案5】:

问题是您使用的教程没有进行用户身份验证。它只检查登录名是否属于管理员,因此会显示一些内容。

这样你永远不会有错误的登录名/密码,只有管理员/非管理员。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多