Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对/系统文件的用户权限_Ruby On Rails_Ruby_Rack_Middleware - Fatal编程技术网

Ruby on rails 对/系统文件的用户权限

Ruby on rails 对/系统文件的用户权限,ruby-on-rails,ruby,rack,middleware,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我想确保他们通过了应用程序的身份验证。

实现以下目标的最佳途径是什么

假设在我的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

我的想法是设置一些机架中间件来实现这一点,当我这样做时,我的中间件似乎可以处理除is/系统之外的所有请求

是否有可以更改的配置设置,以允许中间件也与/系统路径交互

有没有更好、更简单的方法来完成我想要做的事情? 本质上是一个路由或其他东西,如果路径类似于“/system/attachment/project/”,请运行此逻辑块。这种逻辑可能有些复杂,需要访问模型和环境内容。然后,它将最终返回文件内容的响应,或者失败/重定向到权限不足


感谢您在这方面的想法和对话。谢谢。

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

实施概述

  • 用于上载文件并将其与模型关联,例如
    附件
    • 这将方便用户上传文件。每次上传都会创建一条记录。该模型将存储文件名,您可以调用
      @attachment.url
      获取要为用户下载的文件的url
  • 用于实现对
    附件
    模型的权限
用户的工作流

  • 用户将能够上传文件,或者管理员可以手动上传文件
  • 每次上载都会将一条
    附件
    记录保存到数据库中,并引用文件上载到的路径(回形针让您配置此路径,以便将其设置为/system路径)
  • 向用户显示
    附件的索引,即
    GET/attachments
    ,当用户单击下载时,您的应用程序将在
    GET/attachments/1
  • 您的控制器将找到它:
    @attachment=attachment.find params[:id]
  • 现在您可以执行权限检查:
    authorize!@attachment,:read
    (这将基于)
  • 您还可以选择仅显示允许用户查看的附件:
    @attachments=attachment.accessible\u by current\u功能
    请参见
  • 如果出现
    AccessDenied
    错误(因为用户没有此附件的权限),则捕获错误并呈现flash消息或其他内容,否则
  • 然后,您的控制器将使用或启动下载,例如
    send_file@attachment.url、filename:@attachment.attachment_file\u name、disposition:“attachment”
此方法利用现有的上载和权限库,以最少的代码完成您的目标。另一个好处是,用户永远不会看到上载文件的实际URL,他们只会看到资源丰富的路径(例如/attachments/1)而且您不必公开/system目录,这是一个非常好的主意