【问题标题】:django authentication .htaccess staticdjango 身份验证 .htaccess 静态
【发布时间】:2012-08-14 02:22:16
【问题描述】:

在我的应用中,用户可以为其他用户上传文件。 为了使上传的文件只能被地址访问,我需要某种静态文件身份验证系统。

我的想法是为每个用户创建 apache 托管目录,并使用 .htaccess 限制对该目录的访问。

这意味着每次创建新的 django 用户时,我都需要在其中创建一个目录和相应的 .htaccess 文件。我知道我应该在用户模型上使用 post_save 信号来做到这一点,但我不知道如何从 python 级别在用户目录中创建 .htaccess。你能帮我解决这个问题吗?

或者你对我的问题有更好的解决方案?

【问题讨论】:

    标签: python django apache


    【解决方案1】:
    1. 使用python自动重写.htaccess?
    2. 对用户使用数据库并使用 Apache 会话进行身份验证?

    【讨论】:

    • 1 & 2:你能说得更具体点吗?如何创建 .htaccess 并添加特定用户(假设我在变量中有用户名和密码)“使用 Apache 会话”是什么意思
    • 大多数身份验证是通过验证数据库中的用户名 + 密码来完成的,例如MySQL,然后通过session_start()创建会话。
    • 如果您想提供一个带有迷你站点的文件夹,这个解决方案也更好,例如,就像一个普通的旧 html 旁边有 css。
    【解决方案2】:

    为什么没有一个 PrivateUploadedFile 对象,该对象具有文件字段和允许读取该文件的任何用户的 m2m 关系?那你就完全不用乱搞 Apache conf了……

    from django.contrib.auth.models import User
    from django.db import models
    import hashlib
    
    def generate_obfuscated_filename(instance, filename):
       hashed_filename = hashlib.sha1(str(filename)) #you could salt this with something
       return u"your/upload/path/%s.%s" % (hashed_filename, filename.split(".")[-1]) #includes original file format extension
    
    
    
    class PrivateUploadedFile(models.Model):
      file = models.FileField(upload_to=generate_obfuscated_filename)
      recipients = models.ManyToManyField('User')
      uploader = models.ForeignKey('User', related_name="files_uploaded")
    
      def available_to(self, user):
         #call this as my_uploaded_file_instance.available_to(request.user) or any other user object you want
         return user in self.recipients.all() #NB: not partic. efficient, but can be tuned
    

    【讨论】:

    • 我有这样的东西,但我没有解决问题。请注意,该文件必须上传到公共目录才能从外部访问。我可以验证用户是否是视图中的收件人,但该文件仍然可供所有人访问。
    • 好吧,你为什么不用哈希来混淆文件名 - 我将编辑上面的代码以反映这一点
    • 虽然我很感激我通过默默无闻为您提供安全性,而不是基于身份验证的适当解决方案
    【解决方案3】:

    遇到了这个django-sendfile,它可以用来提供静态文件。可能会有所帮助。

    【讨论】:

      【解决方案4】:

      让 Django 正常处理身份验证和授权,然后使用 Apache 的mod_xsendfile 让 Apache 处理发送实际文件。请记住将文件上传到无法直接访问的位置,最好是在 Apache 的文档根目录之外。

      This question 有一个很好的例子来说明如何实现这种行为,但它基本上归结为在您的视图中设置response['X-Sendfile'] = file_path

      django-sendfile 做同样的事情,但是对于几个不同的 web 服务器(和方便快捷方式),和django-private-files 是一样的,但也实现了PrivateFileField

      【讨论】:

        【解决方案5】:

        添加一个控制用户身份验证的视图,并通过django's static files serving tools提供文件:

        def get_file(request, some_id):
            # check that the user is allowed to see the file
            # obtain the file name:
            path = path_from_id(some_id)
            # serve the file:
            return django.views.static.serve(request, path, document_root=your_doc_root)
        

        这是一个非常安全的解决方案,但如果您以这种方式提供大量文件,则可能并不理想。

        编辑:django 页面上的免责声明不适用于此处。显然,使用static.serve 为您的文件提供所有 的效率会很低。但是,从某种意义上说,它是安全的,您只将文件提供给被允许的用户。

        【讨论】:

        • 从逻辑上讲它可以解决问题,但正如您所指出的,可能存在一些效率问题
        • 只有当您以这种方式提供大量文件时!如果我是你,我会实施它并仅在你可以衡量性能影响时重新考虑它。要知道,“过早的优化是万恶之源”。 ;-)
        • 当你链接到的页面有一个巨大的免责声明说:“使用这种方法效率低且不安全。不要在生产环境中使用它。使用这个仅用于开发。”
        • @Daniel 叹息...我知道有人会对免责声明做出反应
        • +1 不知道你为什么被否决,因为这似乎是 OP 的最佳解决方案,它避免了尝试使用 Django/Python 生成 Apache conf 文件的丑陋。
        猜你喜欢
        • 2011-10-04
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 2011-09-23
        • 2013-09-09
        相关资源
        最近更新 更多