Я работаю над рельсами в mvc framework и хочу запретить пользователю создавать пароль из последних 4 паролей.
вот что я сделал до сих пор, на самом деле я следовал тому коду кого-то из github, но, похоже, он не упомянул encrypted_password_changed
функцию и encrypted_password
функцию.
Таблица истории паролей
class CreatePasswordHistories < ActiveRecord::Migration
def self.up
create_table(:password_histories) do |t|
t.integer :user_id
t.string :encrypted_password
t.timestamps
end
end
def self.down
drop_table :password_histories
end
end
Модель пользователя
class User < ApplicationRecord
include ActiveModel::Validations
has_many :password_histories
after_save :store_digest
validates :password, :unique_password => true
private
def store_digest
if encrypted_password_changed?
PasswordHistory.create(:user => self, :encrypted_password => encrypted_password)
end
end
end
Пользовательский валидатор
require 'bcrypt'
class UniquePasswordValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.password_histories.each do |ph|
bcrypt = ::BCrypt::Password.new(ph.encrypted_password)
hashed_value = ::BCrypt::Engine.hash_secret([value, Devise.pepper].join, bcrypt.salt)
record.errors[attribute] << "has been used previously." and return if hashed_value == ph.encrypted_password
end
end
end