使用devise gem对应用程序的所有用户进行身份验证。我正在尝试实现活动存储。
假设所有用户在访问应用程序时都必须进行身份验证:
class ApplicationController < ActionController::Base
before_action :authenticate_user!
...
end
如何保护Active Storage生成的路由?
上传文件的URL不需要认证就可以访问,未经认证的用户可以获取Active Storage生成的文件URL。
使用devise gem对应用程序的所有用户进行身份验证。我正在尝试实现活动存储。
假设所有用户在访问应用程序时都必须进行身份验证:
class ApplicationController < ActionController::Base
before_action :authenticate_user!
...
end
如何保护Active Storage生成的路由?
上传文件的URL不需要认证就可以访问,未经认证的用户可以获取Active Storage生成的文件URL。
3条答案
按热度按时间hgb9j2n61#
这不是一个完整的答案,而是一个起点:
要点:您需要覆盖重定向控制器。
docs for activestorage/app/controllers/active_storage/blobs_controller.rb说道:
如果您需要在签名的blob引用的通过隐藏的安全因素之外实施访问保护,则需要实现自己的身份验证重定向控制器。
另外,如果您计划使用预览文档来预览ActiveStorage/app/models/active_storage/blob/representable.rb,请说
Active Storage提供了一个[用于预览的控制器操作],但您可能希望创建自己的操作(例如,如果您需要身份验证)。
您还可以在this rails github issue中找到一些相关信息
**更新:**这里是一个最小的例子,当使用
devise
gem时,“应该”可以防止未经授权的访问重定向。我想,如果用户登录,将被重定向到的URL如何被保护,这仍然是另一个故事。默认情况下,它们在5分钟后过期,但这可以设置为更短的时间,如10秒(如果您将下面示例中的第6行替换为
expires_in 10.seconds
)使用以下代码创建一个文件
app/controllers/active_storage/blobs_controller.rb
:请注意,与original code相比,唯一的变化是添加了第二行
更新二:
以下是您可以在
ActiveStorage::RepresentationsController
和ActiveStorage::BlobsController
中包含的一个问题,以便为ActiveStorage
启用devise
身份验证参见要点https://gist.github.com/dommmel/4e41b204b97238e9aaf35939ae8e1666,也包括在此处:
yhived7q2#
如果要对主动存储提供的所有端点实施身份验证,可以基于original implementation覆盖
ActiveStorage::BaseController
:72qzrwbm3#
我对这里的解决方案不满意:重新实现所有控制器和路由,或覆盖
ActiveStorage::BaseController
。当原始源代码更改时,两者似乎都可能会中断。
我所做的是将身份验证修补到现有的
ActiveStorage::BaseController
中:我还没有测试所有的活动存储的功能,所以我不能保证它会全部工作,但到目前为止,它的工作,因为我的预期。