rails 教程:cookie 与记住令牌不匹配 [英] rails tutorial: cookie doesn't match remember token

查看:52
本文介绍了rails 教程:cookie 与记住令牌不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在做 Michael Hartl 的 Rails 教程第 8 章.当我尝试通过存储在浏览器 cookie 中的 remember_token 查找用户时,它不起作用.find_by 方法返回 NIL.我一直在尝试通过查看存储在浏览器上的记住令牌 cookie 并将其与存储在用户数据库中的记住令牌进行比较来进行调试.他们不匹配,我不知道为什么.这是会话助手的代码.

module SessionsHelper定义登录(用户)remember_token = User.new_remember_tokencookies.permanent[:remember_token] = remember_tokenuser.update_attribute(:remember_token, User.encrypt(remember_token))self.current_user = 用户结尾定义登录?!current_user.nil?结尾def current_user=(用户)@current_user = 用户结尾定义当前用户#remember_token = User.encrypt(cookies[:remember_token])remember_token = "71e45660fbaa69bad9fb55b912f80122a584f6af"#@current_user ||= User.find_by(remember_token: remember_token)@current_user ||= User.find_by_remember_token(remember_token)结尾结尾

我一直在调整它以试图弄清楚发生了什么.为了调试,我注释掉了正常的行和使用我在数据库中看到的值明确设置记住令牌 - 然后应用程序工作.当我将存储在浏览器中的 cookie 值与存储在数据库中的记住令牌的值进行比较时,它们不匹配.

我注意到的另一件事是我无法调用 User_find_by.我收到一个错误,说它无法识别此方法,因此我将其注释掉.但是,我可以调用 User.find_by_remember_token.可能是我安装了错误版本的东西?

我已尝试重置数据库 - 但我可以看到它并且看起来它包含所有正确的列.

这是_header.html.erb 代码:

</标题>

解决方案

看起来问题可能出在 SessionsHelper 中的第 20 行.应该是:

@current_user ||= User.find_by(remember_token: remember_token)

您尝试调用不存在的方法 find_by_remember_token,而不是将记住令牌传递到 User.find_by() 方法中.

I am doing Michael Hartl's Rails Tutorial Chapter 8. When I try to find a user by remember_token stored in the browser cookie it isn't working. The find_by method returns NIL. I have been trying to debug by looking at the remember token cookie stored on the browser and comparing it to the remember token stored in the user database. They don't match and I don't know why. Here is the code for the Session Helper.

module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    #remember_token = User.encrypt(cookies[:remember_token])
    remember_token = "71e45660fbaa69bad9fb55b912f80122a584f6af"
    #@current_user ||= User.find_by(remember_token: remember_token)
    @current_user ||= User.find_by_remember_token(remember_token)

  end

end 

I have been tweaking it to try and figure out what is going on. To debug I commented out the normal lines and set the remember token explicitly with the value I see in the database - then the app works. When I compare the value of the cookie stored in the browser to the value of remember token stored in the database they don't match.

Another thing I noticed is that I can't make a call to User_find_by. I get an error that says it doesn't recognize this method so I commented it out. I can however call to User.find_by_remember_token. It is possible that I have the wrong version of something installed?

I have tried resetting the database - but I can see it and it looks like it has all the right columns.

Here is the _header.html.erb code:

<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="navbar-inner">
    <div class="container">
      <%= link_to "sample app", root_path, id: "logo" %>
      <nav>
        <ul class="nav pull-right">
          <li><%= link_to "Home", root_path %></li>
          <li><%= link_to "Help", help_path %></li>
          <% if signed_in? %>
            <li><%= link_to "Users", '#' %></li>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                Account <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
                <li><%= link_to "Profile", current_user %></li>
                <li><%= link_to "Settings", '#' %></li>
                <li class="divider"></li>
                <li>
                  <%= link_to "Sign out", signout_path, method: "delete" %>
                </li>
              </ul>
            </li>
          <% else %>
            <li><%= link_to "Sign in", signin_path %></li>
          <% end %>
        </ul>
      </nav>
    </div>
  </div>
</header>

解决方案

It looks like the problem could be line 20 in your SessionsHelper. Should be:

@current_user ||= User.find_by(remember_token: remember_token)

Instead of passing the remember token into the User.find_by() method you're attempting to call a method find_by_remember_token, which doesn't exist.

这篇关于rails 教程:cookie 与记住令牌不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆