Использование 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 делать что-то подобное.

Другие вопросы по тегам