2017-09-20 2 views
0

Ich benutze elocryptfive für die Verschlüsselung einiger Felder in der Datenbank - kurz gesagt ist es eine PHP-Eigenschaft, die verschlüsselte Attribute verschlüsselt, bevor sie in die Datenbank geschrieben und entschlüsselt werden zeigt sie dem Benutzer (mit getAttribute und andere solche Methoden).Datenverschlüsselung funktioniert nicht mehr im Eloquent-Modell nach dem Upgrade auf Laravel 5.5

Einfachere Version davon kann in this laracasts discussion gefunden werden.

Es gab keine Probleme bei der Verwendung von Laravel-Versionen vor 5.5. Nach dem Upgrade der Seite auf laravel 5.5 habe ich festgestellt, dass Werte, die verschlüsselt werden sollten, stattdessen im Klartext dargestellt wurden.

Ich habe Problem in Paket Github-Konto eingereicht, um Hilfe zu bitten. In der Zwischenzeit habe ich einige Dinge ausprobiert:

  1. hinzugefügt elocryptfive Paket in frisch installierten Laravel 5.2 und 5.4 - Verschlüsselung gearbeitet richtig
  2. tat das gleiche auf Lager Laravel 5.5 - die Werte nur nach dem ersten verschlüsselt wurden speichern, und nach jeder nachfolgenden Aktualisierung entschlüsselt gespeichert
  3. ich habe nichts gefunden in Foren im Zusammenhang/laracasts noch

es scheint, dass es zu einigen Änderungen zwischen 5.4 und 5.5 zusammenhängen könnte, habe ich bereits versucht, einige vergleichen Klassen in Eloquent Namensraum gab aber auf.

Antwort

0

Nach erneut die Änderungen zwischen 5.4 und 5.5-Tags in Laravel/Rahmenpaket Vergleich fand ich den Grund in getDirty Methode des src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php Zuges aus.

In Laravel 5.4 war:

foreach ($this->attributes as ...

dann in 5,5 wurde folgendermaßen geändert:

foreach ($this->getAttributes() as ...

Als getAttributes Verfahren einer von denen ist, die Daten zu entschlüsseln, es sieht, dass Die sinnvollste Lösung ist jetzt, getDirty() entweder im Verschlüsselungsmerkmal oder in Anwendungsmodellen, die es verwenden, zu überschreiben.

Das modifizierte Verfahren würde wie folgt aussehen:

public function getDirty() 
{ 
    $dirty = []; 

    foreach ($this->attributes as $key => $value) { 
     if (! $this->originalIsEquivalent($key, $value)) { 
        $dirty[$key] = $value; 
     } 
    } 

    return $dirty; 
} 
Verwandte Themen