ruby-on-rails - 使用 Lockbox 和 CarrierWave 为 Ruby on Rails 加密和解密文件上传
问题描述
我正在尝试使用Lockbox来加密和解密文件上传,但文档假定我不知道我缺乏知识,并且维护 repo 的人似乎太忙而无法提供任何帮助。有人可以帮我理解这一点吗?
文档说主密钥用于创建存储在模型上的密码。它说这个密码的模式字段应该是text
orbinary
并且命名为 likeattribute_ciphertext
而不是 plain attribute
。结果,我的模型如下所示:
class IdentityDocument < ApplicationRecord
belongs_to :user, foreign_key: :user_id
validates :document_front_ciphertext, :document_back_ciphertext, presence: true
mount_uploader :document_front_ciphertext, IdentityDocumentsUploader
mount_uploader :document_back_ciphertext, IdentityDocumentsUploader
end
根据 CarrierWave 的部分,加密就像encrypt
在我的上传器中添加一个一样简单:
class IdentityDocumentsUploader < CarrierWave::Uploader::Base
encrypt
end
控制器创建模型:
def create
@id_doc = current_user.identity_documents.new(id_doc_params)
end
def id_doc_params
params.require(:identity_document).permit(:document_front_ciphertext, :document_back_ciphertext)
end
视图将参数提交给控制器:
<%= form_for @id_doc do |f| %>
<%= f.label :document_front_ciphertext, "Front of driver's license or other state ID" %>
<%= f.file_field :document_front_ciphertext %>
<%= f.label :document_back_ciphertext, "Back of driver's license or other state ID" %>
<%= f.file_field :document_back_ciphertext %>
<%= f.submit "Upload", data: { disable: true } %>
<% end %>
这个 SQL 输出看起来是未加密的(我猜这是有意的?也许文件上传不需要加密的数据库字段,我不需要_ciphertext
在我的模式中?):
INSERT INTO "identity_documents" ("user_id", "document_front_ciphertext", "document_back_ciphertext") VALUES ($1, $2, $3) RETURNING "id" [["user_id", 1], ["document_front_ciphertext", "california-drivers-license.jpg"], ["document_back_ciphertext", "2016-11-25-license-4.jpg"]]
在我的控制台中查询这个模型看起来像这样:
id = IdentityDocument.find 4
#<IdentityDocument id: 4, user_id: 1, document_front_ciphertext: "california-drivers-license.jpg", document_back_ciphertext: "2016-11-25-license-4.jpg">
id.document_front_ciphertext
#<IdentityDocumentsUploader:0x00007fec0cfad980 @model=#<IdentityDocument id: 4, user_id: 1, document_front_ciphertext: "california-drivers-license.jpg", document_back_ciphertext: "2016-11-25-license-4.jpg">, @mounted_as=:document_front_ciphertext, @file=#<CarrierWave::SanitizedFile:0x00007fec0cfad098 @file="/Users/me/code/site/public/uploads/identity_document/document_front_ciphertext/4/california-drivers-license.jpg", @original_filename=nil, @content_type=nil, @content=nil>, @filename=nil, @cache_id=nil, @versions={}, @format=nil, @storage=#<CarrierWave::Storage::File:0x00007fec0cfad7c8 @uploader=#<IdentityDocumentsUploader:0x00007fec0cfad980 ...>, @cache_called=nil>>
出于某种原因,此 Uploader 包含整个模型,但只有第一个图像可通过@file
或获得@mounted_as
。
这让我开始解密并将图像显示给管理员。文档说在我的控制器中做这样的事情:
def id_document
send_data user.identity_document.document_front_ciphertext.read, type: user.identity_document.document_front_ciphertext.content_type
end
...但是,这会导致Errno::ENAMETOOLONG
错误。如果我在 ' 的第一个参数的末尾更改read
为,我的视图会充满......我认为什么是加密文件?它看起来像这样:path
send_data
/Users/me/code/project/public/uploads/identity_document/document_front_ciphertext/1/OWkN7fKEetY2vBWXxkAdWFr96aKOF7Abt8Q7E5cNWvK7zALMwUoH63ZpvYnvYQ7mLqbf32Imqdt+85WpyLjPKf+xmEjHIJ3U7PQNviMDJsBl+OHQRLsfurqNMY2IJXYvmoZLuFN0MykG7BEj9+aKodN0qxlQIHfMQEPBzdQ2G5iss46l7qlyImXt/BH64LYbDxxUqTfCB8B6N7UEZTWy7o8v2ggchQVtleQtxeYsSQoknPlXwa5eEe604c+CHWBXMjisF4LwP+cGcL+j8oIEg+vqwZo3Firxh367b+wzutBWGPNEzNVVtvSKEPToxu9aFjJrBPLwR3LTl8bLqap88i2MqkmtUtAT5UL4514OdqGh5dBduGnpAFOTMVCW4lBPZ7XGltjwCbZ+nLdCAQcT/xgCNRZ8qNpPzTOMsUbNJktwiM5J2J7YfX/H0lhG0CBxFxoGc0FoXs1+Jx82pCHJAdoemk4HNTXIRR3F0qgoVAi16F2wz2ofCJ0DQZT9h5witwxg3XpMYitUw/UnGCoCQpzxV60scnaCRb05wavDRR/97XQvFpBWxIFOjt0MJEzMCpTpCa51KT94a9Q9dL+P04MSQNQ7XVDRvqdsp1LYXKmoxAeBhdZQeOTjBvyLyDvI+TBkqQl/WwsgaabeFDw0O8ovo46yVl0OjjHQZOYmFgRz8VHX0iF6xfiqPRXnZlTB/BbhbRocnEGXav1DpwhLeEFtm/2OigZglBNtbI7B2t6EsEq87/eFHMRjbfUHGAovxfBlc3ZFXS9IlGFmhr5NdhBbEW/oaXc0ZpvR7tTx6H+yyvv6HFAa0tSwV6JThCc3OlvMGpykhQ3R58J5E1BYe/NJrKM3VlvTBptQEP4+RFDct83sthbCYwhlclAeAPDLPjbop6CaA35iV+9skkb1cpGlj3NLx7hY66ZloVDiE8JhCLD/sQTcvZ0zQ3/r7VFeXydiQZpu4QTA9v0Q+Cq5X+qMe1g5cc3cpfP90LfqfIag8Z+Scl18cNteqArl0Ex/lqQktLVINfZW5J+jvXZTV2Al9F5XW14NGlznXe9R4TT4XnlOzHDodThboLtMngWlIf3v/aywevcOE1TtqmxdwGu5wbsaffzKdZGDaxTWuiapMRn4IJUp7zYxUOSAipL7x++Ski+su5bgbUw/Gn2KFomCYRwwvEH1wVKl6BDajL29K6LEFF/jLHEdvwVhj22G0II747xkKtybHStSRrx+3vV...
那么....我究竟如何显示这些图像?我走在正确的道路上;)但我很困惑。
解决方案
推荐阅读
- javascript - 为什么下面的代码异步执行
- html - 导航栏背景颜色 css
- angular - 尝试将 ReactiveForms 添加到组件时出错`无法绑定到'formGroup'...`
- sql - 如何在 IBM DB2 中的导出结果中也包含列标题
- python - 如何在查找2个列表的差异时维护输出列表的顺序
- android - UnsatisfiedLinkError:没有找到 void mono.android.text.TextWatcherImplementor 的实现
- jquery - JQuery - 如果 div 文本包含存储在数组中的相同文本,则将该文本包装在新 div 中
- android - NDK 解析结果:项目设置:Gradle 模型版本=5.4.1,NDK 版本为 UNKNOWN
- javascript - 如何在 ASP.NET MVC 中创建具有预定义设置的 .xml 文件?
- linux - 使用 Yocto 构建 Linux 映像时,pathspec 'gnulib' 与 git 已知的任何文件都不匹配