Как расшифровать столбцы модели пользователя в Laravel по мере их запроса из DB

#php #laravel #encryption

#php #laravel #шифрование

Вопрос:

Я пытаюсь расшифровать определенные столбцы в моем AppModelsUser . Для этого я создал признак для модели для использования.

 namespace AppTraits;

use IlluminateSupportFacadesCrypt;

trait Encryptable {

    public function getAttribute($key) {
        $value = parent::getAttribute($key);

        if (in_array($key, $this->encryptableColumns())) {
            return Crypt::decryptString($value);
        }
        
        return $value;
    }

    public function setAttribute($key, $value) {
        if (in_array($key, $this->encryptableColumns())) {
            $value = Crypt::encryptString($value);
        }

        return parent::setAttribute($key, $value);
    }
    
    protected function encryptableColumns() {
        return [
            'name',
            'service_number',
            'team',
            'company',
            'callsign'
        ];
    }

}
  

Проблема, с которой я сталкиваюсь, заключается в том, что $value возвращаемое из getAttribute метода не расшифровывается. Если я использую die(Crypt::decryptString($value)) , я вижу, что значение все еще зашифровано.

Мой AppModelsUser имеет use AppTraitsEncryptable;

Любая помощь приветствуется.

Обновление: если я изменю его на return 'foo'; все значения, станет foo так, что он определенно выполнит метод.

Если я запускаю Crypt::decryptString(Auth::user()->name) , это работает, поэтому я в замешательстве.

Ответ №1:

Итак, я в замешательстве, но это, похоже, решило проблему:

 return Crypt::decryptString(Crypt::decryptString($value));
  

Комментарии:

1. Это указывает на то, что где-то в строке вы случайно дважды зашифровали значение.

2. Это все тестовые данные, поэтому, возможно, мне следует обрезать данные и определить, где это произошло, и перейти оттуда? Исходное сообщение должно работать так, как ожидалось? @ceejayoz

Ответ №2:

Эти ссылки могут вам помочь. Я знаю, что это не отвечает на ваш вопрос, но показывает другой и более простой способ достижения того, что необходимо.

https://github.com/gregoryduckworth/Encryptable