2014-02-02 3 views
0

Таким образом, на моем локальном хосте знак остается и пользователь выполнил вход. Однако на Heroku после входа в систему он даже не узнает, что пользователь все еще выполнил вход. в журналах Heroku, он начинает -A получить запрос на войти -SessionsController визуализирует новый сеанс -A пользователь обязуется -A POST запрос на запуск сессий происходит -redirect происходит -user вход, видимо, ISN» t сохраненоВход Heroku не сохраняется

-Это похоже на проблему с файлом cookie?

Это мой Сеансов контроллер

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.authenticate(params[:email], params[:password]) 
    if user 
    session[:user_id] = user.id 
    sign_in user 
    redirect_to root_url, :notice => "Logged in!" 
    else 
    flash.now.alert = "Invalid email or password" 
    render "new" 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to posts_url, :notice => "Logged out!" 
    end 


end 

Это мой SessionsHelper

module SessionsHelper 
     def sign_in(user) 
      cookies.permanent[:remember_token] = user.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 
      @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
     end 

     def current_user?(user) 
      user == current_user 
     end 


     def is_admin? 
      signed_in? ? current_user.admin : false 
     end 

     def sign_out 
      current_user.update_attribute(:remember_token, 
             User.encrypt(User.new_remember_token)) 
      cookies.delete(:remember_token) 
      self.current_user = nil 
     end 


    end 

В моей модели пользователя я сохранить remember_token перед сохранением

before_save :create_remember_token 
def create_remember_token self.remember_token = User.encrypt(User.new_remember_token) 

Любые идеи было бы гораздо оценили!

ответ

2

После вашего шага кода за шагом:

  1. Пользователь, не создается с не помню маркер.
  2. Вызывается метод sign_in. Nil сохраняется в файлах cookie, так как пользователь еще не имеет знака.
  3. Ваш метод current_user устанавливает @current_user на nil, потому что User.find_by (nil) возвращает nil и не вызывает исключение в качестве User.find (nil).

Хотя я не уверен на 100%, это причина, по которой ваш код ломается (поскольку я не вижу, какие обратные вызовы вы написали), это, безусловно, имеет смысл. Если в вашей локальной среде вы создаете нового пользователя с нуля, я предполагаю, что он тоже сломается. Единственное место, где я вижу, что вы определяете токен запоминания для пользователя, находится в методе sign_out - если вы вошли в систему при реализации этой функции, вышли из системы, чтобы протестировать ее и запустили обратно, код, похоже, сработает.

Эта проблема может быть исправлена ​​с помощью обратного вызова для установки значка_потока пользователя при создании через обратный вызов или в методе sign_in.

В качестве побочного примечания, если вы следуете за выполнением сессий Hartl, я бы определенно пересмотрел его, так как вы допустили довольно большую ошибку в том, как вы обрабатываете токены. Зашифрованный токен должен храниться в вашей базе данных, а незашифрованный должен храниться в файле cookie. Затем, используя find_by, вы должны шифровать этот файл cookie, чтобы найти пользователя в базе данных. Поскольку в настоящее время вы стоите, вы сохраняете голый запоминающийся токен как в db, так и в cookie, что создает проблемы безопасности.

+0

Почему nil будет сохранен в файлы cookie в методе знака, если после создания пользователя я сохраняю имя_сохранения, связанное с пользователем? – google1254

+1

Если у вас есть обратный вызов в модели, которая точно сохраняет токен памяти, то я не уверен - я не знаю, потому что вы не предоставили эти данные. Все, что я вижу, это то, что в контроллере это не делается, а в методе знака это тоже не делается. Поэтому я пришел к выводу, что предоставил предоставленную информацию. Я бы определенно сошёл в консоли Хероку. geku run rails c. Затем вручную создайте нового пользователя «@user = User.create (yourattributes)», а затем посмотрите, есть ли у пользователя запоминающий токен «@ user.remember_token» – FCStrike

+0

Хороший звонок. Я проверил, и пользователь remember_token всегда равен нулю.Если у меня есть before_save: create_remember_token в моей модели пользователя, и это определение для create (def create_remember_token self.remember_token = SecureRandom.urlsafe_base64 end) есть ли причина, по которой она не сохраняется? – google1254

Смежные вопросы