Доступ к паролю пользователя: переменная область в Rails - PullRequest
2 голосов
/ 09 апреля 2009

Я пишу очень простую почтовую систему для приложения Rails. Я использую RESTful-аутентификацию. Это довольно обычная настройка, когда я отправляю одно и то же письмо, когда пользователь регистрируется и когда пользователь забывает свой пароль. У меня только одна проблема, которую я не могу обернуть вокруг себя.

Я бы хотел использовать один и тот же шаблон электронной почты для обоих экземпляров, даже если электронное письмо «нового пользователя» будет приходить с контроллера пользователя, а электронное письмо с «забытым паролем» - с контроллера паролей.

Письмо выглядит примерно так:

<%=h @user.name %>, 
Your membership details:
Username: <%=h @user.login %>
Password: <%=h @user.password %>

Когда пользователь регистрируется, это прекрасно работает, в результате чего электронное письмо выглядит примерно так:

  Bryan,
  Your membership details:
  Username: bryan
  Password: password

К сожалению, все ломается при попытке использовать этот шаблон для отправки электронного письма с «забытым паролем» с контроллера паролей. Что меня смущает, так это то, что это всего лишь разрывы:

  Bryan,
  Your membership details:
  Username: bryan
  Password: 

Другими словами, @ user.name остается в силе, как @ user.login. Но почему-то в этом состоянии @ user.password не проходит.

Спасибо за ответы. Чтобы быть ясным, безопасность действительно не является проблемой в этом случае, и по этой причине было бы лучше иметь возможность отправлять забытый пароль в виде простого текста, а не проходить процесс сброса пароля, но я действительно ценю, что это обычно это не так.

Ответы [ 6 ]

2 голосов
/ 09 апреля 2009

Трудно сказать, не видя часть вашего кода, в частности методы контроллера.

Возможно, однако, что в электронном письме для регистрации используется пароль до его шифрования. Незашифрованный пароль обычно недоступен для последующих действий, поскольку он хранится в зашифрованном виде в БД.

Если, однако, ваш контроллер паролей устанавливает новый пароль, а не пытается восстановить старый, скорее всего, проблема в другом месте.

В любом случае, это столько же спекуляций, сколько можно сделать, не видя код.

1 голос
/ 09 апреля 2009

Не делай этого

Многие пользователи используют одни и те же пароли в нескольких местах (да, не должны, но они делают). Хранение их паролей в виде простого текста ставит под угрозу не только безопасность вашего сайта, но и безопасность ваших пользователей на других сайтах. И даже не заставляйте меня отправлять пароли в виде открытого текста по электронной почте.

Делайте, как предлагают другие, иметь систему сброса пароля, а не систему "здесь ваш пароль".

1 голос
/ 09 апреля 2009

Я согласен с Сарой Мэй. Это связано с тем, что он хранит пароли. Обычно attr_accessor :password в модели пользователя устанавливает виртуальный атрибут для пароля, который затем используется при входе в систему. На этапе регистрации объекту пользователя будет присвоено какое-либо значение атрибута пароля, но при последующем получении пользовательской записи поле пароля будет пустым.

Я не думаю, что в любом случае это "лучший" способ сделать что-то, отправьте им ссылку, где они могут сбросить свой пароль, а не просто свой оригинальный пароль, потому что, если они однажды забыли его, что мешает им забыть его снова?

1 голос
/ 09 апреля 2009

Если вы загляните в базу данных, вы увидите хэш пароля и солевой хеш.

Перед сохранением в базе данных вам потребуется сохранить пароль в виде простого текста, используя отдельную переменную с паролем в виде открытого текста, который вы можете передать в ActiveMailer и отправить без шифрования в электронное письмо.

@user = User.find(params[:id])
password = params[:user][:password]
options = {
    :password => password,
    :user => @user
}

if @user.update_attributes(params[:user]) and Mailer.deliver_reset(options)
    flash[:notice] = "Check your email (#{@user.email}) for your new password."
    redirect_to_back_or_default('/')
else
    flash[:error] = "Look at the errors below"
end
0 голосов
/ 10 апреля 2009

restful-authentication хранит пароль только временно - достаточно долго, чтобы зашифровать его и сохранить зашифрованную версию. Это для безопасности, как уже упоминали другие.

Поскольку вы не слишком беспокоитесь о безопасности этого приложения, я бы порекомендовал создать уникальный токен для каждого пользователя и предоставить ему URL-адрес для входа в систему. Рекомендовать URL, потому что «пароль» (даже сгенерированный) может дать пользователю ожидание, что он может его изменить. Вы можете по электронной почте своим пользователям что-то вроде:

 Bryan,
  Your membership details:
  Username: bryan
  Your url: http://domain.com/x7sjs0qn

Ваши пользователи могут нажать этот URL и войти в систему автоматически. Таким образом, вы никогда не дадите пользователю шанс дать вам пароль, который он может использовать в другом месте, и - если он забудет его, вы можете отправить его по электронной почте в виде обычного текста и не подвергать другие учетные записи риску.

0 голосов
/ 09 апреля 2009

Я предполагаю, что пароль хранится в хешированном виде, намеренно, чтобы вы не могли знать пароль пользователя. Когда пользователь забывает пароль, вам нужно отправить ему ссылку, действительную только в течение нескольких дней, которая позволит пользователю сбросить пароль, не зная старого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...