2009-08-27 10 views
13

Buduję witrynę, w której zarejestrowani użytkownicy mogą przesyłać pliki. Pliki te są następnie przesyłane za pośrednictwem Apache. Tylko zalogowani użytkownicy powinni mieć dostęp do tych plików.Zabezpieczony dostęp do statycznego nośnika w witrynie Django

Przeczytałem this page, ale wydaje się, że ludzie musieliby się zalogować dwukrotnie, aby uzyskać dostęp do strony i mediów, za każdym razem przy użyciu innego typu pola logowania.

Czy istnieje sposób wokół tego, czy jest jakiś inny sposób, aby ograniczyć dostęp do mediów statycznych obsługiwanych przez Apache przy użyciu bazy danych uwierzytelniania Django?

Używam mod_pythona.

EDIT: Jak skończyło się na rozwiązywaniu tego po przeczytaniu odpowiedzi Van Gale i this:

  1. Switched do WSGI.
  2. zainstalowana mod_xsendfile
  3. Przeniesiony wszystkie pliki multimedialne publicznego do podkatalogu w/media/publicznym
  4. Dodany dostęp do folderu publicznego przy użyciu aliasu/media//var/www.../media/public publicznego
  5. dodano WSGIScriptAlias ​​/ media/protected//var/www.../apache/django.wsgi (tak samo jak w przypadku obsługi reszty miejscu)
  6. dodano XSendFile On i XSendFileAllowAbove na
  7. do aplikacji Django i dodanej urlconf dla/media/protected, który w zasadzie to, co jest here, zmodyfikowany tylko dla mojego auth system przynależności. Obsługuje adresy URL, takie jak/media/protected/GROUP_ID/file, dzięki czemu tylko członkowie GRUPY mogą pobierać pliki.
+0

Inny możliwy problem z podejściem opisanym w docs Django jest to, że wydaje się być przy użyciu uwierzytelniania podstawowego - to wysyła hasła w postaci zwykłego tekstu zakodowane Base64, więc nie jest bezpieczny, chyba że również używać SSL dla wszystkich żądań. –

Odpowiedz

10

Zwykłym sposobem na to jest, aby przejść z powrotem specjalny nagłówek do serwera WWW.

Możesz to zrobić za pomocą nginx używając x-accel-redirect, jak w tym Django snippet.

Dla Apache'a, powinno być całkiem podobne używając modułu mod_xsendfile (discussion and examples na liście mailingowej użytkowników Django).

+0

Mam zamiar dać mod_xsendfile try. –

+0

Zadziałało! Musiałem przejść na WSGI, ale nie było to tak trudne, jak myślałem. –

+0

W module mod_wsgi 3.0 można przekazać Stanowisko o statusie 200. Katalogi muszą być odwzorowane za pomocą adresu URL, który jest następnie przywoływany w lokalizacji.Ponieważ mapowanie adresów URL jest wymagane, aby klienci zdalni nie mogli się do nich dostać, należy użyć reguły mod_rewrite, aby uczynić je zabronionymi, jeśli nie są żądaniami podrzędnymi Apache. Inną opcją jest użycie rozszerzenia wsgi.file_wrapper w celu optymalnego zwrócenia pliku bezpośrednio z Django. W tej chwili nie można tego zrobić z Django, ale będzie dozwolona w przyszłej wersji. –

2

Jeśli masz wolność, aby przełączyć się z Apache lighttpd, to najprostszym rozwiązaniem byłoby wykorzystanie mod_secdownload który zrobi dokładnie to, co chcesz, czyli zapewnienie uwierzytelnienia aplikacji służąc jednocześnie rzeczywiste pliki za pośrednictwem serwera WWW.

Jeśli jednak utkniesz w Apache, sugeruję mod_auth_token, tutaj wspominają o PHP, ale możesz wygenerować token w Pythonie lub innym języku. Używając mod_auth_token będziesz w stanie wygenerować token w swojej aplikacji, a następnie serwer WWW będzie obsługiwał plik statyczny wykorzystujący token.

Powiązane problemy