запретить пользователю создавать пароль из его последних 4 паролей - PullRequest
0 голосов
/ 30 апреля 2019

Я работаю над рельсами в 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
...