аутентификация django .htaccess статический - PullRequest
2 голосов
/ 06 мая 2010

В моем приложении пользователи могут загружать файлы для других пользователей. Чтобы сделать загруженные файлы доступными только для адресата, мне нужна какая-то статическая система аутентификации файлов.

Моя идея - создать размещенный каталог apache для каждого пользователя и ограничить доступ к этому каталогу с помощью .htaccess.

Это означает, что каждый раз, когда создается новый пользователь django, мне нужно создать каталог и соответствующий файл .htaccess в нем. Я знаю, что должен делать это с помощью сигналов post_save на модели User, но я не знаю, как создать .htaccess в каталоге пользователя с уровня Python. Вы можете помочь мне с этим?

Или, может быть, у вас есть лучшее решение моей проблемы?

Ответы [ 5 ]

1 голос
/ 06 мая 2010

Почему бы не иметь объект 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
1 голос
/ 06 мая 2010
  1. Использовать python для автоматической перезаписи .htaccess?
  2. Использовать базу данных с пользователями и использовать сессии Apache для аутентификации?
0 голосов
/ 13 августа 2012

Пусть Django обрабатывает аутентификацию и авторизацию как обычно, а затем использует Apache mod_xsendfile, чтобы Apache обрабатывал фактический файл. Не забудьте загружать файлы в место, к которому нет прямого доступа, в идеале вне корня документа Apache.

Этот вопрос имеет хороший пример того, как реализовать это поведение, но в основном сводится к установке response['X-Sendfile'] = file_path по вашему мнению.

django-sendfile делает то же самое, но для нескольких разных веб-серверов (и удобных ярлыков), а django-private-files то же самое, но также реализует PrivateFileField

0 голосов
/ 13 августа 2012

Наткнулся на этот django-sendfile , который можно использовать для обслуживания статических файлов. Может быть полезным.

0 голосов
/ 06 мая 2010

Добавьте представление, управляющее аутентификацией пользователя, и предоставьте файл с помощью инструментов обработки статических файлов django :

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. Однако он защищен в том смысле, что вы передаете файлы только тем пользователям, которым разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...