Как написать и проверить изменения пароля при использовании Authlogic? - PullRequest
5 голосов
/ 09 февраля 2010

Унаследованное мной приложение имеет следующее действие для обновления профиля пользователя:

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

Форма, которая PUT s (на самом деле POST s с _method=PUT) для этого действия имеет поле password и password_confirmation, но не поле old_password. В ходе тестирования я заметил, что мне даже не нужно заполнять поле password_confirmation.

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

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

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

1 Ответ

5 голосов
/ 10 февраля 2010

Первый ответ: Authlogic дает вам основу, но реализация зависит от вас. Большинство сайтов просто предоставляют страницу «изменить пароль», которая показывает только поля «пароль» и «пароль_конфигурация», или страницу «изменить профиль», которая позволяет ОБНОВИТЬ поля, которые вы хотите изменить в записи пользователя. В зависимости от того, сколько полей в записи вашего пользователя, вы можете выбрать отдельную страницу смены пароля. Вы хотите, чтобы формы были короткими.

Как подтверждение пароля не требуется:

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

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

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

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

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

Вот так:

Добавьте attr_accessor :old_password в модель своего пользователя

И измените свой пользовательский контроллер на:

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

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

...