2016-09-02 8 views
0

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!

Antwort

1

Das Problem besteht darin, dass der Aufruf attr_encrypted auf Klassenebene ist, die Methode encryption_key auf Instanzenebene. Versuchen Sie dies stattdessen:

class Agreement < ApplicationRecord 
    attr_encrypted :test_field, key: ENV['super_secret_key']] 
end 

Zugegeben ungeprüft, aber es sollte funktionieren.

Wirklich, obwohl das private es nicht mehr sichern wird. Sie haben dies richtig gemacht, indem Sie es über env aus einer Konfigurationsdatei geladen haben. Solange es in Ihrem Repository nicht fest codiert ist, müssen Sie dies hauptsächlich tun.

+0

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

+0

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

+0

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

Verwandte Themen