Использование attr_encrypted с DataMapper и Sinatra
Я совсем новичок в DataMapper и Sinatra и особенно в attr_encrypted. Я хочу хранить мои пароли в зашифрованном виде, а затем иметь возможность искать пользователя по имени пользователя и паролю. Я прочитал документацию по attr_encrypted, но до сих пор не понимаю, что делать:(
Можете ли вы привести мой пример проекта с использованием этих двух технологий или рассказать, как изменить мой код для работы:(
Мой пользовательский класс:
class User
include DataMapper::Resource
attr_encryptor :password, :key => 'secret key'
property :id, Serial
property :encrypted_password, Text
end
Когда я сохраняю пользователя, я делаю это так:
username = params[:username]
password = params[:password]
user = User.new(:username => username, :encrypted_password => password)
user.save
который сохраняет оригинальный пароль, а не зашифрованный.
И я понятия не имею, как искать пользователей, когда пароль зашифрован:(
Теперь это что-то вроде этого:
@user = User.all(:username => username, :password => password)
Пожалуйста, извините за вопрос новичка, но я действительно не могу понять это:(
Заранее большое спасибо!
2 ответа
Вам нужно добавить attr_encryptor
после того, как вы указали свойства Data Mapper. Это мешает DataMapper просто заменить encrypted_password
аксессоры со своими:
class User
include DataMapper::Resource
property :id, Serial
property :encrypted_password, Text
# this line moved down from above
attr_encryptor :password, :key => 'secret key'
end
а затем создайте пользователя с помощью:
user = User.new(:username => username, :password => password)
Вы уверены, что хотите найти пользователя на основе зашифрованного пароля? Обычно вы находите пользователя на основании, например, имени пользователя, а затем просто проверяете совпадения пароля.
Если вы действительно хотите это сделать, вам придется либо воссоздать зашифрованный пароль в своем коде и выполнить поиск по нему (вам нужно проверить документы, чтобы увидеть, как выполняется шифрование):
User.all(:username => username, :encrypted_password => encrypt(password))
Или же выберите всех подходящих пользователей и отфильтруйте их в своем коде:
User.all(:username => name).select {|u| u.password == password}
Ваш зашифрованный пароль :password
так что вы должны сделать
User.new(:username => username, :password => password)
Чтобы найти пользователя по имени пользователя и паролю, вам просто нужно сделать
User.first(:username => username, :password => password)
В любом случае вы можете избежать использования этого драгоценного камня вместо bcrypt
делать что-то подобное.