Приложение, которое я наследовал, имеет следующее действие для того, чтобы обновить профиль пользователя:
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 с a _method=PUT
) к тому действию имеет a password
и password_confirmation
поле, но нет old_password
поле. Я заметил посредством тестирования этого, я не должен даже заполнять password_confirmation
поле.
Первый вопрос: существует ли более установленный способ сделать изменение пароля при использовании Authlogic?
Второй вопрос: есть ли какая-либо литература по лучшим практикам (особенно с точки зрения удобства использования) на изменениях пароля? Это должна быть отдельная форма, не смешанная в с другими пользовательскими полями?
Третий вопрос: Большинство сайтов имеет old_password
поле, но Authlogic, кажется, не поддерживает это исходно. Каков способ Authlogic-ey подтвердить, что это - на самом деле сам пользователь, изменяющий пароль, а не кого-то, кто взломал их сессию?
Первый ответ: Authlogic дает вам основу, но реализация зависит от вас. Большинство сайтов просто предоставляют страницу "изменить пароль", которая показывает только поля 'password' и 'password_confirmation' или страницу "редактировать профиль", которая позволяет вам UPDATE поля, которые вы хотите изменить в записи пользователя. В зависимости от того, сколько полей содержится в записи пользователя, вы можете выбрать отдельную страницу изменения пароля. Вы хотите, чтобы формы были короткими.
Что касается необязательности подтверждения пароля:
Второй ответ: Вы найдете много стандартов юзабилити, но я просто придерживаюсь 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
(возможно, вы захотите изменить предупреждение...)