Как использовать Has_secure_password при попытке рефакторинга?

Я пытаюсь реорганизовать механизм авторизации railstutorial.

Моя версия рельсов 3.2.0, я использую ruby ​​1.9.3-p0 и postrgresql 9.1.

Пока что мои тесты проходят, когда дело доходит до неудачной попытки входа, но успешный вход не удается (причина в том, что мне нужно реорганизовать старый механизм входа).

Вот моя функция sign_in помощников сеанса:

def sign_in(employee)
  cookies.permanent.signed[:remember_token] = [employee.id, employee.salt]
  self.current_employee = employee
end.

Одна проблема, которую я сразу вижу с функцией sign_in, заключается в том, что has_secure_password уже заботится о шифровании, соли и т. Д. Я подумал, что, возможно, мне следует использовать password_digest вместо employee.salt, но это тоже не удалось.

Я хочу, чтобы срок действия моих файлов cookie истекал через два часа. Я нашел эту опцию на api.rubyonrails.org в разделе cookie.

 cookies[:key] = {
                  value => "employee.id, employee.salt",
                  expires => 2.hours.from.now
                  }

Другой вопрос, который у меня есть, связан с тем фактом, что у has_secure_password уже есть метод аутентификации, поэтому это означает, что мне не нужно использовать определение аутентификации, определенное в модели сотрудника (модель пользователя) в учебнике по рельсам, но когда я его комментирую out я получаю чтение флага:

NoMethodError: undefined method 'authenticate'

Вот мои контроллеры сеанса создают действие:

def create
  employee = Employee.authenticate(params[:session][:email],
                                   params[:session][:password])
  if employee.nil?
    flash.now[:error] = "Invalid email/password combination."
    @title = "Sign in"
    render 'new'
   else
    sign_in employee
    redirect_back_or employee
   end
 end

Кажется, что проблема с Employee.authenticate.

Итак, у меня по существу есть три вопроса, и они заключаются в следующем:

В учебнике по рельсам мы проходим довольно длительный процесс шифрования и применения соли и т. д. к паролю сотрудников. Поскольку has_secure_password об этом уже позаботился, какую переменную я передал бы в свои функции или аргументы, которые захватили бы зашифрованный пароль?

Следующий вопрос связан с истечением срока действия файла cookie и как я буду использовать его в функции sign_in?

Наконец, как мне использовать метод аутентификации, чтобы рельсы распознавали его как подлинный метод?

Просто для протокола: я просмотрел railsguide, api.rubyonrails.org и другие вопросы, заданные на SO, похожие на этот. Конечно, это просто указывает на мое непонимание принципов, но я учусь и хорошо следую указаниям.

Спасибо за любые мысли, предложения и/или ресурсы, которыми вы могли бы поделиться со мной.

Обновление Я перечитал API на has_secure_password, и аутентификация принимает только один аргумент, а именно незашифрованный пароль... так что мне есть с чем работать.

Мне все еще нужна помощь, мысли или предложения, которые вы могли бы предложить... спасибо.

обновление Я нашел эту статью, посвященную тайм-аутам сеанса: http://madkingsmusings.blogspot.com/2011/05/session-timeouts-on-rails.html Я все еще работаю, чтобы понять, смогу ли я заставить его работать на меня, но он адаптирован для рельсового учебника. Что касается других вопросов, Майкл Хартл занят выпуском второго издания учебника по Ruby on Rails, и в этом выпуске он будет иметь дело с has_secure_password.


person thomasvermaak    schedule 24.01.2012    source источник


Ответы (1)


Доступна новая версия railstutorial.

Что касается первого и последнего вопроса... Вы обнаружите, что аутентификация чрезвычайно проста. В модели пользователя:

has_secure_password

В сессионном контроллере:

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

В SessionsHelper:

def sign_in(user)
  cookies[:remember_token] = user.remember_token
  current_user = user
end

Это должно было быть очевидно, но я даже не подумал поискать код на github. Может еще кто оценит ссылку. Вот исходный код Hartl 2-го издания Sample_App на github

person EricM    schedule 11.04.2012