Как я должен проверить пользовательскую модель в Rails - PullRequest
1 голос
/ 26 октября 2011

У меня есть следующий код для моей модели пользователя:

class User < ActiveRecord::Base
    has_secure_password
    attr_accessible :name, :email, :password, :password_confirmation

    email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

    validates :name,  :presence => true,
                    :length   => { :maximum => 50 }
    validates :email, :presence => true,
                    :format   => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }


  validates_presence_of :password, :on => :create
end

Что я должен добавить или сделать по-другому, чтобы сделать это лучше? В основном это заимствовано из Rails Cast # 270 и урока Майкла Хартла по рельсам.

1 Ответ

2 голосов
/ 26 октября 2011

В целом это выглядит довольно неплохо.

  • Вы разрешаете знаки '+' в адресах электронной почты
  • Вы разрешаете смешанный регистр адресов электронной почты.

Вот связанный вопрос о проверке адресов электронной почты на основе регулярных выражений.

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

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

  validates_presence_of     :password, :if => :password_required?
  validates_confirmation_of :password, :if => :password_required?, :message => "Your password and confirmation must match."
  validates_format_of       :password, :with => /^[\S]{4,}$/, :message => "Your password must be at least 4 characters and contain no spaces or tabs.", :if => :password_required?

  def password_required?
    self.new_record?
  end

Использование password_required? в своем собственном методе дает вам больше гибкости при указании обстоятельств, в которых вы хотите выполнить проверку.

Относительно хранения паролейзашифрованный, я использовал для этого хэши SHA-1.По сути, вы сохраняете хэш пароля SHA-1, затем, когда они аутентифицируются, вы сравниваете хэш SHA-1 пароля, который они вводят, с сохраненным хешем.Таким образом, пароль не сохраняется в виде открытого текста.Вот фрагмент кода:

  # Encrypts some data with the salt.
  def self.encrypt(password, salt)
    Digest::SHA1.hexdigest("--#{salt}--#{password}--")
  end

  # Encrypts the password with the user salt
  def encrypt(password)
    self.class.encrypt(password, salt)
  end

Эти настройки позволяют использовать методы User.encrypt(password, salt) и user.encrypt(password).Используйте метод уровня класса для создания зашифрованной версии того, что кто-то вводит при входе в систему, и используйте метод уровня объекта при сохранении чьего-либо пароля.Я пропустил некоторые части, но, по крайней мере, это дает вам возможность подумать.

Примечание: Вот больше информации о хэшах SHA-1 , чем вам когда-либо понадобится.

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