web-dev-qa-db-fra.com

Comment faire du crise verrouillable avec le nombre de tentatives infructueuses

Utilisation du congise 2.1.2 et Rails 3.2.6

Je fais ce Q &a Juste au cas où d'autres rencontrent ce problème car j'ai trouvé une documentation peu et dispersée pour cela.

Cette erreur peut se produire si vous essayez de configurer Devise comme verrouillable.

undefined local variable or method `locked_at' for [someClass]

Cela signifie que votre modèle n'a pas les attributs appropriés.

Prérequis: Configurez les éléments suivants dans Config/Initialiseurs/Devise.RB

# ==> Configuration for :lockable
# Defines which strategy will be used to lock an account.
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
# :none            = No lock strategy. You should handle locking by yourself.
config.lock_strategy = :failed_attempts

# Defines which key will be used when locking and unlocking an account
config.unlock_keys = [ :email ]

# Defines which strategy will be used to unlock an account.
# :email = Sends an unlock link to the user email
# :time  = Re-enables login after a certain amount of time (see :unlock_in below)
# :both  = Enables both strategies
# :none  = No unlock strategy. You should handle unlocking by yourself.
config.unlock_strategy = :email

# Number of authentication tries before locking an account if lock_strategy
# is failed attempts.
config.maximum_attempts = 20

# Time interval to unlock the account if :time is enabled as unlock_strategy.
# config.unlock_in = 1.hour

Configurez votre modèle pour inclure devise :lockable:

class Example < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :lockable
38
David Nix

Simplement décompressez ces chaînes dans la migration du congé:

  ## Lockable
  # t.integer  :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
  # t.string   :unlock_token # Only if unlock strategy is :email or :both
  # t.datetime :locked_at
21
Mikhail Grishko

Devise nécessite ces trois attributs sur votre modèle. Par conséquent, génèverez la migration suivante et exécutez-la.

class AddLockableToExamples < ActiveRecord::Migration
  def change
    add_column :examples, :failed_attempts, :integer, default: 0
    add_column :examples, :unlock_token, :string # Only if unlock strategy is :email or :both
    add_column :examples, :locked_at, :datetime
  end
end

J'espère que cela sauver quelqu'un d'autre heure de Google-Fu.

62
David Nix