Ich versuche attr_encrypted
zu bekommen, einige Daten zu verschleiern, bevor Sie es in der Datenbank speichern. Ich muss mich später mit der Logger-Ausgabe befassen, aber im Moment möchte ich nur die Felddaten von einem übermittelten Formular abrufen, verschlüsseln und speichern.Rails Zugriff auf private Methoden mit attr_encrypted
Hier ist mein Modell:
class Agreement < ApplicationRecord
attr_encrypted :test_field, key: :encryption_key
private
def encryption_key
ENV['super_secret_key']
end
end
Ich stelle fest, dass, wenn ich auf Kommentar private
scheint alles wie erwartet zu funktionieren. Aber ich will natürlich nicht öffentlich Zugang zu dieser Information geben (ya wissen: super geheimer Schlüssel), also ich möchte, dass es privat ist. Wenn ich jedoch private
einfüge, erhalte ich einen Fehler. Speziell: NoMethodError (undefined method 'bytesize' for :encryption_key:Symbol)
. Was ich bis jetzt ausgeführt habe, ist, dass attr_encrypted
einen Fehler wirft, weil es keinen Schlüssel erhält, weil die private Methode nicht richtig aufgerufen wird. In der Theorie könnte ich im attr_encrypted
Bit key: ENV['super_secret_key']
setzen anstatt eine Methode aufzurufen, aber das Ziel ist es, eine neue Klasse mit der entsprechenden Datenbanktabelle zu erstellen, mit der ich meine Schlüssel speichern, speichern und drehen kann , die wiederum durch eine Umgebungsvariable für eine zusätzliche Sicherheitsebene verschleiert werden.
Also meine eigentliche Frage ist: Was ist los mit meinen privaten Methoden, und warum ist private
Dinge frustrierend, auch im Rahmen des Modells? Ich denke, ich mache etwas sehr grundsätzlich falsch, aber ich habe auch Beispiele von anderen, die dies tun, gefolgt, so würde jede Anleitung zu meinem Fehler sehr geschätzt werden!
Danke für die Antwort! Das scheint es leider nicht zu tun. 1) Was fehlt mir hier (etwas offensichtlich Grundlegendes)? Wie können Sie feststellen, dass 'attr_encrypted' auf Klassenebene und der' encryption_key' auf Instanzenebene liegt? Und warum funktioniert das Entfernen von 'privat'? 2) Unabhängig davon, ob das funktionierte oder nicht, warum sollte Private es nicht mehr sichern? Vielen Dank! – DanielNordby
Ich hätte den Fehler genauer lesen sollen. Sie müssen die Methode aufrufen und das Ergebnis an attr_encrypted übergeben. So könnten Sie tun: 'attr_encrypted: test_field, key: encryption_key'. Beachten Sie, dass ich das Symbol entfernt habe und nur den Methodennamen dort habe. Aber stattdessen, da es einmal aufruft, wenn die Anwendung geladen wird, warum überhaupt die Methode überhaupt? Also habe ich meine Antwort auf die Ausgabe von env aktualisiert. – agmcleod
Um Ihre zweite Frage zu beantworten, wird es sicher sein, es nicht in Controller-Renderaufrufen verfügbar zu machen. Solange Sie nur innerhalb der Modelle darauf zugreifen, sollte es in Ordnung sein. Da es in ENV [] ist, können Sie bereits überall in der App darauf zugreifen. – agmcleod