【问题标题】:User permissions to /system files用户对 /system 文件的权限
【发布时间】:2014-12-22 21:23:52
【问题描述】:

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

假设在我的 rails 应用程序中我有文件夹:

/system/cms/attachments
/system/attachments/
/system/attachments/Project
/system/attachments/Meeting

文件正在上传到这些文件夹并且可以通过网络访问。这时候我想添加一些权限来访问它们。如果有人试图访问myapp/system/attachments/meetings/doc1.docx,我想确保他们通过应用程序进行身份验证。对于另一个myapp/system/attachments/Project/doc2.docx,我可能想检查用户是否具有特定角色。

我的想法是设置一些机架中间件来完成此操作,当我这样做时,我的中间件似乎可以处理我对 /system 所期望的所有请求

是否可以更改配置设置以允许我的中间件也与 /system 路径交互。

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

感谢您对此的想法和对话。谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby rack middleware


    【解决方案1】:

    通过将您的上传与模型相关联并将权限应用于将用于启动下载的模型来实现这一点会更好、更简单。

    实施概述

    • 使用Paperclip 上传文件并将它们与模型相关联,例如Attachment
      • 这将使用户轻松上传文件。每次上传都会创建一条记录。该模型将存储文件名,您将能够调用@attachment.url 来获取要为用户下载的文件的 URL。
    • 使用CanCanCanAttachment 模型上实现权限。

    用户的工作流程

    • 用户可以上传文件,或者管理员可以手动上传文件。
    • 每次上传都会将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
    • 您也可以选择只显示允许用户查看的attachments:@attachments = Attachment.accessible_by current_ability 查看https://github.com/ryanb/cancan/wiki/Fetching-Records
    • 如果出现AccessDenied 错误(因为用户没有此附件的权限),则捕获该错误并呈现一则消息或其他内容,否则
    • 然后您的控制器将使用send_datasend_file 启动下载,例如send_file @attachment.url, filename: @attachment.attachment_file_name, disposition: 'attachment'

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

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2011-01-18
      • 2019-08-01
      相关资源
      最近更新 更多