2016-04-19 7 views
1

Ich benutze nginx/uWSGI und versuche, eine web2py-Site mit 'auth.requires_login()' (https://groups.google.com/forum/#!topic/web2py/0j92-sPp4bc) zu sperren, so dass nur eingeloggte Benutzer darauf zugreifen können Es ist sogar der Inhalt unter/statisch /. Wenn ich einrichten nginx Konfigurationsdatei mitWeb2py & nginx - muss ich einen statischen Ordner einrichten

location ~* /(\w+)/static/ { 
     root /home/www-data/web2py/applications/; 
} 

wie in der Dokumentation empfohlen, nicht, dass Bypass die Zugriffskontrolle und niemand gestattet, den statischen Inhalt zu sehen? Wenn ich diese Zeile aus der Konfigurationsdatei herauslasse, teilt web2py den angemeldeten Benutzern immer noch den statischen Inhalt mit (obwohl vermutlich etwas langsamer)?

Antwort

1

Ja, diese nginx-Regel wird web2py umgehen. Entfernen Sie es und lassen web2py Griff/static/wird nicht viel ändern, da dies direkt aus der web2py Handbuch ist:

http://127.0.0.1:8000/a/static/filename Es gibt keine Controller „statisch“ genannt wird. web2py interpretiert dies als eine Anforderung für die Datei namens "filename" im Unterordner "static" der Anwendung "a". Wenn statische Dateien heruntergeladen werden, erstellt web2py weder eine Sitzung, noch gibt es einen Cookie aus oder führt die Modelle aus.

Also, weil es keinen Controller gibt, können Sie nicht auth.requires_login() für statischen Inhalt direkt verwenden. Dies liegt daran, dass Dateien in/static/im Allgemeinen nicht dazu gedacht sind, zugriffsgesteuert zu sein, oder dass Browser nicht in der Lage sind, die erforderlichen css, js usw. zu erhalten, um die Begrüßungs- oder Anmeldeseite zu rendern.

Wenn Sie jedoch noch standortweite Zugriffskontrolle auf statische Dateien (zB private pdf-Dateien) möchten, können Sie es wie so tun:

  • in Ihrem Anwendungsverzeichnis, erstellen Sie einen Ordner private_static
  • genannt

dann in Ihrem Controller folgendes hinzufügen:

#default.py 
import os 

auth.requires_login() 
def private_static(): 
    filename = os.path.join(*request.args) 
    allowed = ['private1.pdf', 'private2.pdf'] # have some kind of validation for security! 
    if not filename in allowed: 
     raise HTTP(404) 
    return response.stream(open(os.path.join(request.folder, 'private_static', filename))) 

und in Ihrem Ansicht etwa wie folgt:

<a href="{{=URL('private_static', args=['private1.pdf'])}}">Private Document</a> 

Jetzt http://.../private_static/private1.pdf Zugriff auf den Benutzer erzwingen, bevor um sich einzuloggen die statische Datei zu bekommen.

Verwandte Themen