用户对/ system文件的权限

时间:2014-12-22 21:23:53

标签: ruby-on-rails ruby rack middleware

完成以下任务的最佳途径是什么。

让我们说在我的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 /'那样运行这个逻辑块。这种逻辑可能有些复杂,需要访问模型和环境。然后它最终将返回文件内容的响应或失败/重定向到权限不足。

欣赏你的想法和对话。感谢。

1 个答案:

答案 0 :(得分:0)

通过将上传内容与模型相关联并将权限应用于将用于启动下载的模型,可以更好,更简单地实现此目的。

实施概述

  • 使用Paperclip上传文件并将其与模型相关联,例如Attachment
    • 这样可以让用户轻松上传文件。将为每个上载创建一条记录。该模型将存储file_name,您可以调用@attachment.url来获取要为用户下载的文件的URL。
  • 使用CanCanCan实施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_datasend_file启动下载,例如send_file @attachment.url, filename: @attachment.attachment_file_name, disposition: 'attachment'

此方法利用现有的上传和权限库,以最少的代码完成您的目标。另一个好处是用户永远不会看到上传文件的实际URL,他们只会看到资源丰富的路径(例如/ attachments / 1),您不必公开公开/ system目录,这是一个非常好的好主意。