Использование devise_security_extension с приложением Rails - PullRequest
0 голосов
/ 24 октября 2018
Rails 3.2

Я работаю над приложением Rails, используя Devise для управления пользователями.Новое требование заключается в добавлении некоторых правил к

  • . Убедитесь, что пароли имеют длину от 8 до 70 символов и имеют по крайней мере один символ нижнего регистра, один символ верхнего регистра, одну цифру и одинспециальный символ.
  • Старые пароли архивируются, до 6
  • Невозможно использовать пароль в архиве
  • срок действия пароля истекает через 3 месяца
  • Учетные записи, которыене использовался более 3 месяцев, истек
  • Срок действия сессий истекает через 15 минут бездействия

Я добавил в свой Gemfile следующее:

gem 'devise_security_extension', '0.10.0'

и к моему config / initializers / devise.rb я добавил следующее:

config.expire_password_after = 3.months
config.password_regex= /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/
config.password_archiving_count = 6
config.deny_old_passwords = true
config.expire_after = 3.months
config.timeout_in = 15.minutes
config.expire_auth_token_on_timeout = true

Я изменил свой models / user.rb следующим образом:

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :invitable,
     :confirmable, :password_expirable, :secure_validatable, :password_archivable,
     :session_limitable, :expirable

Затем я сделалследующее:

bundle install
rails generate devise_security_extension:install

На основании рекомендаций StackOverflow я также сделал следующее:

rails g migration AddPasswordChangedAtToUser password_changed_at:datetime:index

, который произвел следующую миграцию:

class AddPasswordChangedAtToUser < ActiveRecord::Migration
  def change
    add_column :users, :password_changed_at, :datetime
    add_index :users, :password_changed_at
  end
end 

Затем ясделал следующее:

rails g migration CreateOldPasswordsTable

, который создал миграцию, чтоЯ отредактировал следующим образом:

class CreateOldPasswordsTable < ActiveRecord::Migration  
  create_table :old_passwords do |t|
    t.string :encrypted_password, :null => false
    t.string :password_archivable_type, :null => false
    t.integer :password_archivable_id, :null => false
    t.datetime :created_at
  end
  add_index :old_passwords, [:password_archivable_type, :password_archivable_id], :name => :index_password_archivable
end  

Я запустил миграции и убедился, что таблица пользователей была изменена, а таблица old_passwords была создана

Когда я запустил приложение, я получил логинэкран, и когда я попытался войти, используя мои существующие учетные данные, я получил следующее (из файла журнала):

Started POST "/users/sign_in" for 63.251.170.1 at 2018-10-24 00:08:34 +0000
Processing by SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Mi9uscJh/b6qusoV3kclz7FXWj952AnYV9mNwURG8tQ=", "user"=>{"email"=>"xxxxx@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
  [1m[35mUser Load (0.4ms)[0m  SELECT `users`.* FROM `users` WHERE `users`.`email` = 'xxxxx@gmail.com' LIMIT 1
Completed 500 Internal Server Error in 81.7ms

NoMethodError (undefined method `expired_at' for #<User:0x0000000a91b360>):
  app/middleware/catch_json_parse_errors.rb:8:in `call'

Есть идеи?

Что сработало:

Мне не хватало следующих изменений в таблице пользователей:

add_column :users, :password_changed_at, :datetime
add_index :users, :password_changed_at
add_column :users, :unique_session_id, :string, :limit => 20
add_column :users, :last_activity_at, :datetime
add_index :users, :last_activity_at
add_column :users, :expired_at, :datetime
add_index :users, :expired_at
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...