Как использовать «Has_secure_password» при попытке рефакторинга? - PullRequest
1 голос
/ 24 января 2012

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

Моя версия rails - 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 под куки.

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

Еще один вопрос, который у меня есть, связан с тем, что has_secure_password уже имеет метод authenticate, поэтому мне не нужно использовать определение authenticate, определенное в модели employee (пользовательская модель) в руководстве по rails, но когда Я комментирую это, я получаю флаг, читающий:

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.

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

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

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

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

Только для записи, я искал 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.

1 Ответ

0 голосов
/ 11 апреля 2012

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

По первому и последнему вопросу ... Вы найдете аутентификацию чрезвычайно простой. В модели User:

has_secure_password

В SessionController:

  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. Может быть, кто-то еще оценит ссылку. Вот 2-й исходник Hartl Sample_App на github

...