完成以下任务的最佳途径是什么。
让我们说在我的rails应用程序中我有文件夹:
/system/cms/attachments
/system/attachments/
/system/attachments/Project
/system/attachments/Meeting
文件正在上传到这些文件夹中,并且可以通过Web访问。这时我想添加一些权限来访问它们。如果有人试图访问myapp/system/attachments/meetings/doc1.docx
我想确保他们对应用程序进行身份验证。对于另一个myapp/system/attachments/Project/doc2.docx
,我可能想要检查用户是否具有某个角色。
我的想法是设置一些Rack Middleware来实现这一点,当我这样做时,我的中间件似乎处理我期望的那些是/ system
是否有配置设置我可以更改以允许我的中间件也与/系统路径交互。
有没有更好,更简单的方法来完成我想要做的事情? 基本上是一个路径或路径,如果路径像'/ system / attachment / project /'那样运行这个逻辑块。这种逻辑可能有些复杂,需要访问模型和环境。然后它最终将返回文件内容的响应或失败/重定向到权限不足。
欣赏你的想法和对话。感谢。
答案 0 :(得分:0)
通过将上传内容与模型相关联并将权限应用于将用于启动下载的模型,可以更好,更简单地实现此目的。
实施概述
Attachment
@attachment.url
来获取要为用户下载的文件的URL。Attachment
模型的权限。用户工作流程
Attachment
记录保存到数据库,并引用文件上传到的路径(Paperclip让您配置此路径,以便将其设置为/ system路径Attachment
的索引,即GET /attachments
,当用户点击下载一个时,您的应用会在GET /attachments/1
@attachment = Attachment.find params[:id]
authorize! @attachment, :read
(这将基于rules you set up in an ability.rb file)attachment
:@attachments = Attachment.accessible_by current_ability
,请参阅https://github.com/ryanb/cancan/wiki/Fetching-Records AccessDenied
错误(因为用户没有此附件的权限),请抓住错误并呈现Flash消息或其他内容,否则send_file @attachment.url, filename: @attachment.attachment_file_name, disposition: 'attachment'
此方法利用现有的上传和权限库,以最少的代码完成您的目标。另一个好处是用户永远不会看到上传文件的实际URL,他们只会看到资源丰富的路径(例如/ attachments / 1),您不必公开公开/ system目录,这是一个非常好的好主意。