Разработать: Когда слишком много настроек? - PullRequest
2 голосов
/ 30 июня 2011

Я пишу заявление для себя, поэтому я не тороплюсь, и моя единственная цель - делать все правильно. Для аутентификации я использую devise, но я получаю много настроек. Я видел несколько хороших функций, появившихся в Rails 3.1, которые могли бы облегчить реализацию auth самостоятельно.

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

# model/User.rb
  #this method is called by devise to check for "active" state of the model
  def active?
    #remember to call the super
    #then put our own check to determine "active" state using 
    #our own "is_active" column
    super and self.is_active?
  end


protected #====================================================================

  # find in db the user with username or email login
  def self.find_record(login)
    where(attributes).where(["name = :value OR email = :value", { :value => login }]).first
  end

  # allow no case sensitive email
  # (saved downcase, fetched downcase)
  def self.find_for_authentication(conditions)
    conditions[:email].downcase!
    super(conditions)
  end

  # find the user in the db by username or email
  def self.find_for_database_authentication(conditions)
    login = conditions.delete(:login)
    where(conditions).where(["name = :value OR email = :value", { :value => login }]).first
  end

  # Attempt to find a user by it's email. If a record is found, send new
  # password instructions to it. If not user is found, returns a new user
  # with an email not found error.
  def self.send_reset_password_instructions(attributes={})
    recoverable = find_recoverable_or_initialize_with_errors(reset_password_keys, attributes, :not_found)
    recoverable.send_reset_password_instructions if recoverable.persisted?
    recoverable
  end

  def self.find_recoverable_or_initialize_with_errors(required_attributes, attributes, error=:invalid)
    case_insensitive_keys.each { |k| attributes[k].try(:downcase!) }

    attributes = attributes.slice(*required_attributes)
    attributes.delete_if { |key, value| value.blank? }

    if attributes.size == required_attributes.size
      if attributes.has_key?(:login)
        login = attributes.delete(:login)
        record = find_record(login)
      else
        record = where(attributes).first
      end
    end

    unless record
      record = new

      required_attributes.each do |key|
        value = attributes[key]
        record.send("#{key}=", value)
        record.errors.add(key, value.present? ? error : :blank)
      end
    end
    record
  end

  # password not required on edit
  # see: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
  def password_required?
    new_record?
  end


# controllers/registrations_controller.rb
# devise controller for registration
class RegistrationsController < Devise::RegistrationsController

  # update_attributes (with final S) without providing password
  # overrides devise
  # see: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
  def update
    # Devise use update_with_password instead of update_attributes.
    # This is the only change we make.
    if resource.update_attributes(params[resource_name])
      set_flash_message :notice, :updated
      # Line below required if using Devise >= 1.2.0
      sign_in resource_name, resource, :bypass => true
      redirect_to after_update_path_for(resource)
    else
      clean_up_passwords(resource)
      render_with_scope :edit
    end
  end

end

Спасибо

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Я бы пока придерживался идеи, ваши изменения невелики. Однако я бы разработал и извлек изменения, которые вы внесли в новые функции. Затем попытайтесь заставить их задуматься. Таким образом, поддержание их не падает на вас, оно может падать на многих.

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

Также ваш новый метод find_for_authentication, теперь он поддерживается в devise, вставьте ваш инициализатор devise ...

config.case_insensitive_keys = [ :email ]
0 голосов
/ 30 июня 2011

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

...