Django - медиафайлы - безопасность
Я создал приложение Django с видео файлами. Я использую Gunicorn & Nginx. Пользователь (не root), который запускает сервер django.
Я ограничил представления, чтобы только пользователи с правильными правами могли просматривать их. Это работает нормально.
Но при просмотре видео я могу получить url. (../media/videos/video.mp4)
Теперь все, у кого есть этот файл-локация, могут посмотреть видео.
Теперь я немного запутался. Нужно ли мне использовать пакет типа django-sendfile2's? Или мне нужно изменить настройки моего сервера и ограничить доступ к папкам с медиафайлами?
Мне удалось защитить свои файлы с помощью пакета django-private-storage. django-sendfile2's также может подойти, но я нашел документацию менее толковой. Следуя инструкциям, я установил пакеты:
pip install django-private-storage
И добавил следующие строки в файл Settings.py:
INSTALLED_APPS += (
'private_storage',
)
PRIVATE_STORAGE_ROOT = os.path.join(BASE_DIR, 'private-media')
в модели я добавил поле:
video = PrivateFileField(upload_to='videos/%Y/%m/%d', null=True)
В представлении я добавил:
from private_storage.views import PrivateStorageDetailView
class PlayJobVideo(PrivateStorageDetailView):
model = Video
model_file_field = "video"
template_name = "index/play_video.html"
def get_object(self):
return Video.objects.get(id=self.kwargs['video_id'])
def can_access_file(self, private_file):
return True
И тогда я написал декоратор owner_only()
def owner-only():
def decorators(view_func, *args, **kwargs):
def wrapper_function(request, *args, **kwargs):
try:
if request.user:
if video.user == request.user:
return view_func(request, *args, **kwargs)
else:
return redirect('index:home')
except:
return redirect('index:home')
return wrapper_function
return decorators
И я добавил этот декоратор в представление.
@method_decorator(owner_only(), name='dispatch')
class PlayVideo(PrivateStorageDetailView):
...