2012-08-10 14 views
38

Usando Idear 2.1.2 y 3.2.6 Carriles¿Cómo hacer Diseñar con cerradura con el número de intentos fallidos

que estoy haciendo esto Q & Un solo en caso de que otros encuentran con este problema porque he encontrado poca y dispersa documentación para ello.

Este error puede ocurrir si intenta configurar Devise como bloqueable.

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

Significa que su modelo no posee los atributos adecuados.

Requisitos: configurar los siguientes en config/inicializadores/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 

Configure su modelo para incluir 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 
+0

Estoy de acuerdo con "pequeña" y la documentación "dispersos" .... – mack

Respuesta

21

Simplemente descomentar esta cadenas en la migración legado:

## 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 
+7

También elimine el comentario de add_index para: unlock_token en la parte inferior de la migración. – Beel

+0

No pude averiguar cómo ejecutar correctamente esta migración específica sin eliminar toda mi tabla 'Usuario' con el comando' rake: db migrate: redo VERSION = '. ¿Hay una mejor manera? ¿O solo hay que escribir una nueva migración? –

61

Devise las necesidades de estos tres atributos en su modelo. Por lo tanto, genere la siguiente migración y ejecútela.

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 

Espero que esto le ahorre a alguien más horas de google-fu.

+5

También querrá agregar un índice en el unlock_token si: correo electrónico o: ambos. add_index: users,: unlock_token,: unique => true – Ted

+0

Aún no funciona para mí. Configuré en 'config.maximum_attempts = 3', pero después de 4 tiempos fallidos, y luego ingresé la contraseña correcta, aún así me permite iniciar sesión. –

+1

Lo siento, me olvidé de descomentar' # config.lock_strategy =: failed_attempts' en 'config/inicializadores/devise.rb' –

Cuestiones relacionadas