Rails 如何实现一个带权限控制的相册

jzlikewei · 2014年08月25日 · 最后由 hz_qiuyuanxin 回复于 2014年08月26日 · 2725 次阅读

具体的来说就是,用户可以上传照片,但是这些个照片只能某些人可见。那么这些图像该如何处理?(储存,权限管理) 我之前做了个头像系统,用的是 Carrierwave,直接所有图片放到 rails app 目录下的 public 下面。

在输出的时候,过滤数据就行了。如果实在很简单,自己写两行代码就行了,如果涉及较复杂的权限控制,则可以用 https://github.com/CanCanCommunity/cancancan

#1 楼 @hz_qiuyuanxin 我权限控制已经控制好了。我现在这这种,生成的头像图片地址是固定的,别人还是能直接通过访问地址来看图的。

#2 楼 @jzlikewei 把图片名字 hash 或许可以

#2 楼 @jzlikewei 把图片名字 hash 或许可以

https://github.com/carrierwaveuploader/carrierwave/wiki/How-To%3A-Secure-Upload

要注意 nginx 开启 send-file 功能还要额外配置。

更好的方法是放到云储存,默认私有,token 访问。

#4 楼 @flowerwrong 和图片名称没关系。这样做只是让别人猜不到真实的图片地址,而不是我发给你个图片地址你打开后提示 403,或发你个相册你打开后提示相册时私有的。 #5 楼 @Rei 我研究下,云存储就算了,这个是个外包项目,没必要再增加成本(不过我用了阿里的 mysql 服务器,最低配的有个很大的优惠)

那就不当成静态资源,放在私有目录,然后 controller 里用 send_file 来处理咯

#7 楼 @hhuai send_file 怎么在 view 页面看呢?

#8 楼 @jzlikewei 直接通过地址访问就是了,一样通过 nginx 发,就是在发送前 rails 校验一下权限

给你举个例 view

<%= image_tag("/images/11") %>

controller images.rb

class ImagesController < ApplicationController

def show
    if login
    send_file "/private_dir/images/#{params[:id] }.png"
    else
    raise 404
    end
end
end

差不多就这个意思,将就看下。

cancancan 就够了。

#10 楼 @hhuai 这样算是 override 了 image_tag 这个函数么?

像 3 楼说的,直接换成 hash 名字是最小的成本了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号