【问题标题】:how can restrict access to media image URL in django如何在 django 中限制对媒体图像 URL 的访问
【发布时间】:2021-07-19 23:49:37
【问题描述】:

如何限制对媒体图像 url 的访问,并使其只能由 django 中的访问所有者用户访问,

这是我的班级模型:

class private_image(models.Model):
    i_user = models.OneToOneField(User, related_name='related_PRF_user', on_delete=models.CASCADE)
    i_image= models.ImageField(upload_to='images', blank=True, null=True )

我的媒体设置是:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media_root/')
MEDIA_URL = '/media_url/'

例如:我不希望用户在他们的浏览器中放置像这样的图像网址“http://127.0.0.1:8000/media_url/images/67155_0_AVemgEZ.jpg”并打开图像,如果请求用户没有同一所有者用户。

我相信,我可以创建一个小函数来检查访问用户和请求的 URL '/media_url/images/' 以获取图像名称,然后使用图像名称从数据库中获取一个对象 然后检查所有者(i_user)是否相同的访问用户。

但是我怎样才能告诉 Django 在服务 MEDIA_URL 请求之前使用这个函数。

如果你有一个例子,那将非常有帮助。

提前谢谢你

【问题讨论】:

    标签: django media-url


    【解决方案1】:

    媒体的所有requests都应该经过一个特定的视图。

    myproject/urls.py

    from myproject.views import media_access
    
    urlpatterns = [
        ...,
        path('media_url/images/<str:path>', media_access, name='media'),
        # or
        # url(r'^media_url/(?P<path>.*)', media_access, name='media'),
    ]
    

    添加视图并检查访问权限。

    myproject/views.py

    from django.http.response import FileResponse
    from django.http import HttpResponseForbidden
    
    def media_access(request, path):    
        access_granted = False
    
        user = request.user
        if user.is_authenticated():
            if user.is_staff:
                # If admin, everything is granted
                access_granted = True
            else:
                # For simple user, only their documents can be accessed
                doc = user.related_PRF_user.i_image  #Customize this...
    
                path = f"images/{path}"
                if path == doc:
                    access_granted = True
    
        if access_granted:
            response = FileResponse(user.related_PRF_user.i_image)
            return response
        else:
            return HttpResponseForbidden('Not authorized to access this media.')
    

    请告诉我这是否有效..

    【讨论】:

    • 我应该将媒体设置保留在 settings.py 文件 (MEDIA_ROOT = os.path.join(BASE_DIR, 'media_root/') MEDIA_URL = '/media_url/') 中,还是我必须删除它?
    • @kder No no.. 保留它兄弟.. 不要删除媒体 url 和 root 否则你的媒体 url 将无法工作......
    • 谢谢它有效,只是我从 url 的路径末尾删除了“/”,在检查“if path == doc.name”之前,我添加了一个新变量“path = f”images /{小路}” ” 。如果您愿意,请更新您的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2018-01-13
    • 2018-10-05
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多