2010-02-09 2 views
5

Приложение I унаследовал имеет следующие действия для обновления профиля пользователя:Как написать и проверить изменения пароля при использовании 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 

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

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

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

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

+0

Причина, по которой у меня возникли проблемы с получением пароля для обновления, является то, что я выполнял '{@user = Factory (: user), UserSession.create (@user)} 'в общем блоке настройки, затем снова выполнив' {@user = Factory (: user)} 'во внутреннем блоке настройки и проверив изменение пароля для этого пользователя, но фактически изменив его на внешнем. D'о! –

ответ

5

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

Что касается password_confirmation не требуется:

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

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

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

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

Третий ответ: В 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 

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