Commit 4c24cabf4709b8421c751970fa72a9eba145b992
Exists in
master
and in
4 other branches
Merge pull request #1012 from NARKOZ/devise
Add 10 minutes lock after 10 failed login attempts (Devise :lockable)
Showing
11 changed files
with
72 additions
and
41 deletions
Show diff stats
Gemfile
Gemfile.lock
... | ... | @@ -148,10 +148,11 @@ GEM |
148 | 148 | nokogiri (>= 1.5.0) |
149 | 149 | daemons (1.1.8) |
150 | 150 | database_cleaner (0.8.0) |
151 | - devise (1.5.3) | |
151 | + devise (2.1.2) | |
152 | 152 | bcrypt-ruby (~> 3.0) |
153 | - orm_adapter (~> 0.0.3) | |
154 | - warden (~> 1.1) | |
153 | + orm_adapter (~> 0.1) | |
154 | + railties (~> 3.1) | |
155 | + warden (~> 1.2.1) | |
155 | 156 | diff-lcs (1.1.3) |
156 | 157 | drapper (0.8.4) |
157 | 158 | email_spec (1.2.1) |
... | ... | @@ -225,7 +226,7 @@ GEM |
225 | 226 | omniauth (1.1.0) |
226 | 227 | hashie (~> 1.2) |
227 | 228 | rack |
228 | - orm_adapter (0.0.7) | |
229 | + orm_adapter (0.3.0) | |
229 | 230 | polyglot (0.3.3) |
230 | 231 | posix-spawn (0.3.6) |
231 | 232 | pry (0.9.9.6) |
... | ... | @@ -356,7 +357,7 @@ GEM |
356 | 357 | raindrops (~> 0.7) |
357 | 358 | vegas (0.1.11) |
358 | 359 | rack (>= 1.0.0) |
359 | - warden (1.2.0) | |
360 | + warden (1.2.1) | |
360 | 361 | rack (>= 1.0) |
361 | 362 | webmock (1.8.7) |
362 | 363 | addressable (>= 2.2.7) |
... | ... | @@ -383,7 +384,7 @@ DEPENDENCIES |
383 | 384 | colored |
384 | 385 | cucumber-rails |
385 | 386 | database_cleaner |
386 | - devise (~> 1.5) | |
387 | + devise (~> 2.1.0) | |
387 | 388 | drapper |
388 | 389 | email_spec |
389 | 390 | ffaker | ... | ... |
app/controllers/application_controller.rb
app/models/user.rb
1 | 1 | class User < ActiveRecord::Base |
2 | 2 | include Account |
3 | 3 | |
4 | - devise :database_authenticatable, :token_authenticatable, | |
4 | + devise :database_authenticatable, :token_authenticatable, :lockable, | |
5 | 5 | :recoverable, :rememberable, :trackable, :validatable, :omniauthable |
6 | 6 | |
7 | 7 | attr_accessible :email, :password, :password_confirmation, :remember_me, :bio, |
8 | - :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme, | |
8 | + :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme, | |
9 | 9 | :theme_id, :force_random_password |
10 | 10 | |
11 | 11 | attr_accessor :force_random_password | ... | ... |
app/views/layouts/devise.html.haml
config/initializers/devise.rb
... | ... | @@ -93,10 +93,6 @@ Devise.setup do |config| |
93 | 93 | # If true, extends the user's remember period when remembered via cookie. |
94 | 94 | # config.extend_remember_period = false |
95 | 95 | |
96 | - # If true, uses the password salt as remember token. This should be turned | |
97 | - # to false if you are not using database authenticatable. | |
98 | - config.use_salt_as_remember_token = true | |
99 | - | |
100 | 96 | # Options to be passed to the created cookie. For instance, you can set |
101 | 97 | # :secure => true in order to force SSL only cookies. |
102 | 98 | # config.cookie_options = {} |
... | ... | @@ -119,7 +115,7 @@ Devise.setup do |config| |
119 | 115 | # Defines which strategy will be used to lock an account. |
120 | 116 | # :failed_attempts = Locks an account after a number of failed attempts to sign in. |
121 | 117 | # :none = No lock strategy. You should handle locking by yourself. |
122 | - # config.lock_strategy = :failed_attempts | |
118 | + config.lock_strategy = :failed_attempts | |
123 | 119 | |
124 | 120 | # Defines which key will be used when locking and unlocking an account |
125 | 121 | # config.unlock_keys = [ :email ] |
... | ... | @@ -129,14 +125,14 @@ Devise.setup do |config| |
129 | 125 | # :time = Re-enables login after a certain amount of time (see :unlock_in below) |
130 | 126 | # :both = Enables both strategies |
131 | 127 | # :none = No unlock strategy. You should handle unlocking by yourself. |
132 | - # config.unlock_strategy = :both | |
128 | + config.unlock_strategy = :time | |
133 | 129 | |
134 | 130 | # Number of authentication tries before locking an account if lock_strategy |
135 | 131 | # is failed attempts. |
136 | - # config.maximum_attempts = 20 | |
132 | + config.maximum_attempts = 10 | |
137 | 133 | |
138 | 134 | # Time interval to unlock the account if :time is enabled as unlock_strategy. |
139 | - # config.unlock_in = 1.hour | |
135 | + config.unlock_in = 10.minutes | |
140 | 136 | |
141 | 137 | # ==> Configuration for :recoverable |
142 | 138 | # |
... | ... | @@ -160,9 +156,9 @@ Devise.setup do |config| |
160 | 156 | # Defines name of the authentication token params key |
161 | 157 | config.token_authentication_key = :private_token |
162 | 158 | |
163 | - # If true, authentication through token does not store user in session and needs | |
159 | + # Authentication through token does not store user in session and needs | |
164 | 160 | # to be supplied on each request. Useful if you are using the token as API token. |
165 | - config.stateless_token = true | |
161 | + config.skip_session_storage << :token_auth | |
166 | 162 | |
167 | 163 | # ==> Scopes configuration |
168 | 164 | # Turn scoped views on. Before rendering "sessions/new", it will first check for | ... | ... |
config/locales/devise.en.yml
... | ... | @@ -35,13 +35,11 @@ en: |
35 | 35 | confirmed: 'Your account was successfully confirmed. You are now signed in.' |
36 | 36 | registrations: |
37 | 37 | signed_up: 'Welcome! You have signed up successfully.' |
38 | - inactive_signed_up: 'You have signed up successfully. However, we could not sign you in because your account is %{reason}.' | |
39 | 38 | updated: 'You updated your account successfully.' |
40 | 39 | destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' |
41 | - reasons: | |
42 | - inactive: 'inactive' | |
43 | - unconfirmed: 'unconfirmed' | |
44 | - locked: 'locked' | |
40 | + signed_up_but_unconfirmed: 'A message with a confirmation link has been sent to your email address. Please open the link to activate your account.' | |
41 | + signed_up_but_inactive: 'You have signed up successfully. However, we could not sign you in because your account is not yet activated.' | |
42 | + signed_up_but_locked: 'You have signed up successfully. However, we could not sign you in because your account is locked.' | |
45 | 43 | unlocks: |
46 | 44 | send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' |
47 | 45 | unlocked: 'Your account was successfully unlocked. You are now signed in.' | ... | ... |
db/migrate/20110913200833_devise_create_users.rb
1 | 1 | class DeviseCreateUsers < ActiveRecord::Migration |
2 | 2 | def self.up |
3 | 3 | create_table(:users) do |t| |
4 | - t.database_authenticatable :null => false | |
5 | - t.recoverable | |
6 | - t.rememberable | |
7 | - t.trackable | |
4 | + ## Database authenticatable | |
5 | + t.string :email, :null => false, :default => "" | |
6 | + t.string :encrypted_password, :null => false, :default => "" | |
8 | 7 | |
9 | - # t.encryptable | |
10 | - # t.confirmable | |
11 | - # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both | |
12 | - # t.token_authenticatable | |
8 | + ## Recoverable | |
9 | + t.string :reset_password_token | |
10 | + t.datetime :reset_password_sent_at | |
11 | + | |
12 | + ## Rememberable | |
13 | + t.datetime :remember_created_at | |
14 | + | |
15 | + ## Trackable | |
16 | + t.integer :sign_in_count, :default => 0 | |
17 | + t.datetime :current_sign_in_at | |
18 | + t.datetime :last_sign_in_at | |
19 | + t.string :current_sign_in_ip | |
20 | + t.string :last_sign_in_ip | |
21 | + | |
22 | + ## Encryptable | |
23 | + # t.string :password_salt | |
24 | + | |
25 | + ## Confirmable | |
26 | + # t.string :confirmation_token | |
27 | + # t.datetime :confirmed_at | |
28 | + # t.datetime :confirmation_sent_at | |
29 | + # t.string :unconfirmed_email # Only if using reconfirmable | |
30 | + | |
31 | + ## Lockable | |
32 | + # t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts | |
33 | + # t.string :unlock_token # Only if unlock strategy is :email or :both | |
34 | + # t.datetime :locked_at | |
35 | + | |
36 | + # Token authenticatable | |
37 | + # t.string :authentication_token | |
38 | + | |
39 | + ## Invitable | |
40 | + # t.string :invitation_token | |
13 | 41 | |
14 | 42 | t.timestamps |
15 | 43 | end |
... | ... | @@ -18,7 +46,7 @@ class DeviseCreateUsers < ActiveRecord::Migration |
18 | 46 | add_index :users, :reset_password_token, :unique => true |
19 | 47 | # add_index :users, :confirmation_token, :unique => true |
20 | 48 | # add_index :users, :unlock_token, :unique => true |
21 | - # add_index :users, :authentication_token, :unique => true | |
49 | + add_index :users, :authentication_token, :unique => true | |
22 | 50 | end |
23 | 51 | |
24 | 52 | def self.down | ... | ... |
db/schema.rb
... | ... | @@ -11,7 +11,7 @@ |
11 | 11 | # |
12 | 12 | # It's strongly recommended to check this file into your version control system. |
13 | 13 | |
14 | -ActiveRecord::Schema.define(:version => 20120627145613) do | |
14 | +ActiveRecord::Schema.define(:version => 20120706065612) do | |
15 | 15 | |
16 | 16 | create_table "events", :force => true do |t| |
17 | 17 | t.string "target_type" |
... | ... | @@ -169,6 +169,8 @@ ActiveRecord::Schema.define(:version => 20120627145613) do |
169 | 169 | t.integer "theme_id", :default => 1, :null => false |
170 | 170 | t.string "bio" |
171 | 171 | t.boolean "blocked", :default => false, :null => false |
172 | + t.integer "failed_attempts", :default => 0 | |
173 | + t.datetime "locked_at" | |
172 | 174 | end |
173 | 175 | |
174 | 176 | add_index "users", ["email"], :name => "index_users_on_email", :unique => true | ... | ... |