Как я пишу и тестирую изменения пароля при использовании Authlogic?

Приложение, которое я наследовал, имеет следующее действие для того, чтобы обновить профиль пользователя:

class UsersController < ApplicationController
  # ...
  def update
    @user = current_user
    if @user.update_attributes(params[:user])
      flash[:notice] = "Successfully updated profile."
      redirect_to root_url
    else
      flash[:error] = "Hrm, something went wrong."
      render :action => 'edit'
    end
  end
end

Форма это PUTs (действительно POSTs с a _method=PUT) к тому действию имеет a password и password_confirmation поле, но нет old_password поле. Я заметил посредством тестирования этого, я не должен даже заполнять password_confirmation поле.

Первый вопрос: существует ли более установленный способ сделать изменение пароля при использовании Authlogic?

Второй вопрос: есть ли какая-либо литература по лучшим практикам (особенно с точки зрения удобства использования) на изменениях пароля? Это должна быть отдельная форма, не смешанная в с другими пользовательскими полями?

Третий вопрос: Большинство сайтов имеет old_password поле, но Authlogic, кажется, не поддерживает это исходно. Каков способ Authlogic-ey подтвердить, что это - на самом деле сам пользователь, изменяющий пароль, а не кого-то, кто взломал их сессию?

5
задан James A. Rosen 9 February 2010 в 18:40
поделиться

1 ответ

Первый ответ: Authlogic дает вам основу, но реализация зависит от вас. Большинство сайтов просто предоставляют страницу "изменить пароль", которая показывает только поля 'password' и 'password_confirmation' или страницу "редактировать профиль", которая позволяет вам UPDATE поля, которые вы хотите изменить в записи пользователя. В зависимости от того, сколько полей содержится в записи пользователя, вы можете выбрать отдельную страницу изменения пароля. Вы хотите, чтобы формы были короткими.

Что касается необязательности подтверждения пароля:

  • Для тестирования это зависит от того, как вы это моделируете или что вы тестируете... контроллер/формы или модель, которую вы тестируете?
  • Является ли require_password_confirmation true? (что является значением по умолчанию)

Второй ответ: Вы найдете много стандартов юзабилити, но я просто придерживаюсь KISS. С точки зрения юзабилити, большинству людей удобно то, что работает и что установлено - так что проверьте Google, Facebook и 37signals. Очень простой процесс. Как упоминалось выше, короткие формы являются важной целью юзабилити.

Если говорить о требованиях безопасности, то лучше всего подойдет PCI Compliance [PDF], в котором изложено несколько правил передачи и хранения финансовых записей, хотя в них нет упоминания об учетных данных пользователя. Если вы примените к счетам те же правила, что и к кредитным картам, у вас будет действительно безопасная система. Поскольку соответствие стандарту PCI не обеспечивается, банки - это еще один отличный ресурс, на который стоит обратить внимание, поскольку плохая обработка сеансов может привести к пропаже большого количества денег. Несколько моих банковских счетов теперь подтверждают мои логины и смены паролей с помощью изображений и вопросов безопасности, помимо стандартного пароля. Я нашел несколько хороших статей об этом.

Что приводит к третьему вопросу...

Третий ответ: В AuthLogic просто проверьте поле "старый пароль" пользователя перед обновлением в вашем users_controller с помощью: @user.valid_password?("old pass")

Например, так:

Добавьте attr_accessor :old_password к вашей модели users

И измените ваш контроллер users на:

def update
    @user = current_user
    if @user.valid_password?(params[:user][:old_password])
      if @user.update_attributes(params[:user].reject{|key, value| key == "old_password"})
        flash[:notice] = 'Successfully updated profile.'
        redirect_back_or_default root_url
      else
        render :action => 'edit'
      end
    else
      flash[:warning] = 'Your old password is WRONG! What is your malfunction!?!'
      render :action => 'edit'
    end
  end

(возможно, вы захотите изменить предупреждение...)

5
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: