2016-09-02 50 views
0

我試圖讓attr_encrypted在將某些數據保存到數據庫之前隱藏一些數據。我需要稍後處理記錄器輸出,但目前我只想從提交的表單獲取字段數據,對其進行加密並保存。Rails使用attr_encrypted訪問私有方法

這裏是我的模型:

class Agreement < ApplicationRecord 
    attr_encrypted :test_field, key: :encryption_key 

    private 

    def encryption_key 
     ENV['super_secret_key'] 
    end 
end 

我注意到,當我註釋掉private似乎一切都按預期運行。但我顯然不希望公開訪問該信息(你知道:超級密鑰),所以我想要它是私人的。但是,當我包含private時,出現錯誤。具體來說:NoMethodError (undefined method 'bytesize' for :encryption_key:Symbol)。我已經鑽研的是attr_encrypted正在拋出一個錯誤,因爲它沒有得到傳遞給它的密鑰,因爲私有方法沒有被正確訪問。

理論上,在attr_encrypted位,我可以只設置key: ENV['super_secret_key']而不是調用一個方法,但這裏的目標是實際創建一個帶有相應數據庫表的新類,通過該類可以保存,存儲和旋轉我的密鑰,而後者又被一個環境變量混淆以獲得額外的安全層。

所以我真正的問題是:我的私人方法發生了什麼,爲什麼private令人沮喪,甚至在模型的範圍內?我想我正在做一些基本上不正確的事情,但我也遵循了其他人的例子,所以對我的錯誤的任何指導都將不勝感激!

回答

1

問題是attr_encrypted調用是在類級別,而encryption_key方法是實例級別。嘗試這樣做,而不是:

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

承認未經測試,但它應該工作。

真的,雖然私人不會再保護它。你通過從配置文件通過env加載它。只要它沒有在你的倉庫中硬編碼,那主要是你需要做的。

+0

感謝您的回覆!不幸的是,似乎並沒有這樣做。 1)我在這裏錯過了什麼(顯然是基本的東西)?你怎麼知道'attr_encrypted'是在課堂級別,而'encryption_key'是在實例級別?爲什麼刪除'私人'使其工作? 2)不管這是否有效,私人爲什麼不再保護它?謝謝! – DanielNordby

+0

我應該更仔細地閱讀錯誤。您需要調用該方法並將結果傳遞給attr_encrypted。所以你可以這樣做:'attr_encrypted:test_field,key:encryption_key'。注意我刪除了這個符號,並且只有方法名。但是,相反,因爲它在應用程序加載時調用一次,爲什麼即使有這個方法呢?所以我更新了我的答案,只是輸出環境。 – agmcleod

+0

要回答你的第二個問題,保持它的安全將不會暴露在任何控制器渲染調用中。只要你在模型中訪問它,它應該沒問題。鑑於它在ENV []中,您可以在應用程序的任何地方訪問它。 – agmcleod