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