2012-08-10 10 views
38

Korzystanie Opracować 2.1.2 i Rails 3.2.6Jak Devise zamykane liczbie nieudanych prób

Robię to Q & A na wszelki wypadek inni uruchamiane na ten problem, ponieważ znalazłem trochę i rozproszone dokumentacji dla tego.

Ten błąd może wystąpić, jeśli spróbujesz skonfigurować Devise jako blokowalną.

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

Oznacza to model nie posiada odpowiednie atrybuty.

Wymagania: skonfigurować następujące w config/inicjalizatory/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 

Skonfiguruj model to 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

mam zgadzając się z „małym” i „rozproszonego” dokumentacja .... – mack

Odpowiedz

21

Wystarczy odkomentować poniższe ciągi w migracji opracować:

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

Odkomentuj także add_index dla: unlock_token u dołu migracji. – Beel

+0

Nie mogłem wymyślić, jak z powodzeniem uruchomić tę konkretną migrację bez usuwania całej mojej tabeli "User" za pomocą polecenia rake: db migrate: redo VERSION = '. Czy istnieje lepszy sposób? Czy trzeba po prostu napisać zupełnie nową migrację? –

61

Devise potrzebuje tych trzech atrybutów modelu. Dlatego wygeneruj następującą migrację i uruchom ją.

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 

Mam nadzieję, że to zaoszczędzić innym godzinom google-fu.

+5

Będziesz również dodać indeks na unlock_token jeżeli: e-mail lub: oba. add_index: users,: unlock_token,: unique => true – Ted

+0

Nadal nie działa dla mnie. Ustawiłem na 'config.maximum_attempts = 3', ale po 4 nieudanych czasach, a następnie wpisałem poprawne hasło, nadal pozwala mi się zalogować. –

+1

Niestety zapomniałem odkomentować' # config.lock_strategy =: failed_attempts' w 'config/inicjalizatory/devise.rb' –

Powiązane problemy