【问题标题】:strange cookie behavior in railsRails 中奇怪的 cookie 行为
【发布时间】:2014-01-20 22:26:24
【问题描述】:

我正在尝试完成 rails 教程,但遇到了问题。 在调试它的过程中,我遇到了这种奇怪的行为,我认为这与我的问题有关。

>rails console
DL is deprecated, please use Fiddle
Loading development environment (Rails 3.2.16)
irb(main):001:0> app.cookies['foo'] = 'bar'
=> "bar"
irb(main):002:0> app.cookies['remember_token'] = 'foobar'
=> "foobar"
irb(main):003:0> app.cookies['foo']
=> "bar"
irb(main):004:0> app.cookies['remember_token']
=> "foobar"
irb(main):005:0> app.put app.root_url
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" IS NULL LIMIT 1
=> 200
irb(main):006:0> app.cookies['foo']
=> "bar"
irb(main):007:0> app.cookies['remember_token']
=> ""

注意 cookies['foo'] 在 put 后​​如何保持设置为 'bar',但 cookies['remember_token'] 设置为 ""

谁能解释一下这里可能发生了什么? 我在模型中有一个“remember_token”列,但我不知道它应该如何发挥作用。

这是模型:

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation
  has_secure_password
  validates :name, presence: true, 
                   length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true,
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  validates :password, presence: true,
                       length: { minimum: 6 }
  validates :password_confirmation, presence: true                     
  before_save { email.downcase! }
  before_save :create_remember_token


    private

    def create_remember_token
      puts "in create remember_token"  #added for debug
      self.remember_token = SecureRandom.urlsafe_base64
      puts remember_token   #added for debug
    end

end

这里是数据库:

ActiveRecord::Schema.define(:version => 20140111165943) do

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
    t.string   "password_digest"
    t.string   "remember_token"
  end

  add_index "users", ["email"], :name => "index_users_on_email", :unique => true
  add_index "users", ["remember_token"], :name => "index_users_on_remember_token"

end

我最初的问题与测试失败有关,可以找到here

更新:找到这种奇怪行为的根源

当我开始收集代码以显示完整的控制器时(按照评论中的要求),很明显这将成为我的问题的根源。

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper

  # Force signout to prevent CSRF attacks
  def handle_unverified_request
    sign_out
    super
  end


end

这里是 sign_out 方法(在我的 session_helper 中)

def sign_out
    puts "in sign out"
    cookies.delete :remember_token
    self.current_user = nil
  end

我在 sign_out 方法中添加了一个 puts,并看到它在执行 put(但不是 get)后立即被调用。现在我必须回到教程,看看我一定做错了什么。

【问题讨论】:

  • 请显示完整的控制器,包括登录方法
  • @BillyChan 谢谢,我只需要这个请求就能搞清楚。我做的第一件事是打开 ApplicationController 并找到上面的代码(在我的问题中更新)
  • nPn,很高兴你自己想出来了!控制器是进行此类更改的唯一可能位置。

标签: ruby-on-rails cookies


【解决方案1】:

这里的问题是由于启用了protect_from_forgery 和handle_unverified_request 中的sign_out 方法。 详情见问题末尾的更新

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2017-08-12
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2019-09-01
    • 2015-07-25
    • 2014-06-22
    • 1970-01-01
    相关资源
    最近更新 更多