2012-08-10 11 views
38

Utilizzando Ideare 2.1.2 e Rails 3.2.6Come rendere Devise bloccabile con numero di tentativi falliti

sto facendo questo Q & A nel caso in cui altri corrono in questo problema perché ho trovato poco e dispersi documentazione per questo.

Questo errore può verificarsi se si tenta di impostare Devise come bloccabile.

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

Significa che il modello non ha gli attributi appropriati.

Prerequisiti: impostare i seguenti in config/inizializzatori/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 

Impostare il modello per includere 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

Sono d'accordo con "piccolo" e la documentazione "dispersi" .... – mack

risposta

21

sufficiente togliere il commento stringhe in migrazione disposizione testamentaria:

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

Inoltre, rimuovere il commento add_index per: unlock_token nella parte inferiore della migrazione. – Beel

+0

Non riuscivo a capire come eseguire correttamente questa migrazione specifica senza rimuovere la mia intera tabella 'User' con il comando' rake: db migrate: redo VERSION = '. C'è un modo migliore? O si deve semplicemente scrivere una nuova migrazione? –

61

Devise ha bisogno di questi tre attributi sul modello. Pertanto, generare la seguente migrazione ed eseguirlo.

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 

Spero che questo risparmi altre ore di google-fu.

+5

Si potrà anche aggiungere un indice sulla unlock_token se: email o: entrambi. add_index: users,: unlock_token,: unique => true – Ted

+0

Ancora non funziona per me. Ho impostato su 'config.maximum_attempts = 3', ma dopo 4 volte fallite, e poi ho digitato la password corretta, mi consente ancora di accedere. –

+1

Scusa se ho dimenticato di decommentare' # config.lock_strategy =: failed_attempts' in 'config/inizializzatori/devise.rb' –

Problemi correlati