用户对 /system 文件的权限


完成

以下任务的最佳途径是什么?

假设在我的 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我可能想检查用户是否具有特定角色。

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

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

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

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

通过将上传关联到模型并将权限应用于将用于启动下载的模型来实现此目的会更好、更简单

实施概述

  • 使用回形针上传文件并将其与模型关联,例如 Attachment
    • 这将使用户可以轻松上传文件。每次上传都会创建一条记录。该模型将存储file_name,你将能够调用@attachment.url以获取要为用户下载的文件的 URL。
  • 使用CanCanCan在Attachment模型上实现权限。

用户的工作流程

  • 用户将能够上传文件,或者管理员可以手动上传文件。
  • 每次上传都会将一条Attachment记录保存到数据库,并引用文件上传到的路径(回形针让您配置此路径,以便您可以将其设置为您的/system 路径。
  • 向用户显示Attachment的索引,即 GET /attachments,当用户单击下载一个时,你的应用将在GET /attachments/1
  • 您的控制器会找到它:@attachment = Attachment.find params[:id]
  • 现在您可以执行权限检查:authorize! @attachment, :read(这将基于您在ability.rb文件中设置的规则(
  • 您还可以选择仅显示允许用户查看的attachment@attachments = Attachment.accessible_by current_ability查看 https://github.com/ryanb/cancan/wiki/Fetching-Records
  • 如果引发了AccessDenied错误(因为用户没有此附件的权限(,则捕获错误并呈现 Flash 消息或其他内容,否则
  • 然后,您的控制器将使用send_data或send_file启动下载,例如 send_file @attachment.url, filename: @attachment.attachment_file_name, disposition: 'attachment'

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

最新更新