默认情况下:paperclip gem存储公共目录中的所有附件.
出于安全原因,我不想将附件存储在公共目录中,因此我将它们保存uploads
在应用程序根目录下的目录中:
class Post < ActiveRecord::Base belongs_to :user has_attached_file :some_image, path: ":rails_root/uploads/:attachment/:id/:style/:filename" do_not_validate_attachment_file_type :some_image end
我没有指定url
选项,因为我不想为每个图像附件添加网址.如果指定了url:那么具有该url的任何人都可以访问该图像.这不安全.
在user#show
页面中:我想实际显示图像.如果我使用所有的回形针默认值,那么我可以这样做,因为图像将在公共目录中,图像将有一个网址:
Some image: <%= image_tag @post.some_image %>
看来如果我将图像附件保存在公共目录之外并且没有指定URL(再次:这样做以保护图像),那么图像将不会在视图中呈现.
我知道如何通过pundit gem 在整个应用程序中进行授权.但是,当该图像可公开访问时,授权图像是无用的.因此,我尝试通过删除URL并将图像保存在公共目录之外来使图像无法公开访问,但随后图像不再在视图中呈现.
更新:我的问题归结为:我的图像保存在我的rails应用程序中.使用回形针:有没有办法在视图中安全地显示图像?换句话说:设置它使图像没有自己独立的URL(因为带有该URL的任何人都可以访问该图像,使该图像不安全).以下是安全显示图像的一些示例:
示例#1:仅在用户登录时显示图像.(图像没有自己独立的URL,因此没有其他方法可以访问图像)
示例#2:仅在用户与此图像关联时显示图像.(图像没有自己独立的网址,因此没有其他方法可以访问图像)
其他更新:我知道我可以安全地发送一个send_file
允许用户下载图像的文件,但这不是我想要做的.我不希望用户下载图像.相反:我希望用户能够在网页上实际看到图像.我想在页面上安全地显示/渲染图像.使用send_file
(据我所知)允许用户下载文件.它不会在页面上呈现图像.
你可以用send_file
.假设你secure_image
的路线有动作:
resources :posts do member do get :secure_image end end
以及相应控制器中的跟随方法:
def secure_image send_file Post.find(params[:id]).some_image.path end
您可以在视图中使用受保护的图像:
<%= image_tag secure_image_post_path(@post) %>
这里发生了什么:通常轨(或nginx
或者apache
)将静态文件直接绕过安全检查的速度的缘故.但是请求secure_image
操作遍历整个Rails的堆栈,因此它受到您的身份验证系统的保护.