2012-02-22 23 views
11

El título prácticamente resume mi pregunta. Me gustaría proteger con contraseña algunos archivos en mi aplicación django que vive en heroku.
Si no puedo usar htaccess ¿alguien tiene sugerencias sobre qué más podría usar? Gracias.htaccess en heroku para la aplicación django

+1

Prefiero no utilizar nada django específico porque tengo un servidor de prueba, producción y demostración para tratar con – mea36

+0

¿Por qué no utilizar 'SITE_ID' y el framework de sitios para diferenciar? – Josh

Respuesta

16

Como @mipadi Dicho esto, no se puede utilizar .htaccess en Heroku, pero puede crear un middleware para ello:

from django.conf import settings 
from django.http import HttpResponse 
from django.utils.translation import ugettext as _ 


def basic_challenge(realm=None): 
    if realm is None: 
     realm = getattr(settings, 'WWW_AUTHENTICATION_REALM', _('Restricted Access')) 
    # TODO: Make a nice template for a 401 message? 
    response = HttpResponse(_('Authorization Required'), mimetype="text/plain") 
    response['WWW-Authenticate'] = 'Basic realm="%s"' % (realm) 
    response.status_code = 401 
    return response 

def basic_authenticate(authentication): 
    # Taken from paste.auth 
    (authmeth, auth) = authentication.split(' ',1) 
    if 'basic' != authmeth.lower(): 
     return None 
    auth = auth.strip().decode('base64') 
    username, password = auth.split(':',1) 
    AUTHENTICATION_USERNAME = getattr(settings, 'BASIC_WWW_AUTHENTICATION_USERNAME') 
    AUTHENTICATION_PASSWORD = getattr(settings, 'BASIC_WWW_AUTHENTICATION_PASSWORD') 
    return username == AUTHENTICATION_USERNAME and password == AUTHENTICATION_PASSWORD 

class BasicAuthenticationMiddleware(object): 
    def process_request(self, request): 
     if not getattr(settings, 'BASIC_WWW_AUTHENTICATION', False): 
      return 
     if 'HTTP_AUTHORIZATION' not in request.META: 
      return basic_challenge() 
     authenticated = basic_authenticate(request.META['HTTP_AUTHORIZATION']) 
     if authenticated: 
      return 
     return basic_challenge() 

Luego hay que definir en settings.py:

BASIC_WWW_AUTHENTICATION_USERNAME = "your user" 
BASIC_WWW_AUTHENTICATION_PASSWORD = "your pass" 
BASIC_WWW_AUTHENTICATION = True 
+0

Esto funcionó muy bien. ¿Cómo puedo editar esto para que solo funcione para URL específicas? – mea36

+2

De hecho, me di cuenta de esto usando request.META ['PATH_INFO'] para revisar la url y regresar si no quiero esa contraseña de url protegida – mea36

+0

Impresionante, me complace ayudar. –

-2

No puede usar .htaccess, porque las aplicaciones Heroku no se sirven con Apache. Sin embargo, puedes usar Django authentication.

O puede servir los archivos de otro servidor que es usando Apache.

+0

Ya uso django auth dentro de la aplicación – mea36

+1

¿Quién dice que las aplicaciones de Heroku no se sirven con Apache? Tengo una configuración de Apache que funciona bien. ¿A qué pila pertenece tu respuesta? No tengo problemas para usar los archivos .htaccess en cedro, la configuración básica está [documentada en mi blog] (http://hakre.wordpress.com/2012/05/20/php-on-heroku-again/) en el caso eso es interesante. – hakre

+0

@hakre: la mayoría de las pilas usan nginx. Tal vez el buildpack de PHP hace algo diferente. – mipadi

8

I fue capaz de usar los archivos .htaccess en heroku con la pila de cedro.

  1. Procfile necesidades para especificar una secuencia de comandos para los nodos de web:

    web: sh www/conf/web-boot.sh 
    
  2. Los conf/web-boot.sh incorporan la incluyen de un archivo de configuración de Apache, por ejemplo:

  3. A conf/httpd/default.conf puede entonces permitir la anulación, como lo sabes de apache.

Puede simplemente utilizar .htaccess archivos. Todo el proceso está documentado en detalle en la publicación de mi blog PHP on Heroku again, de la cual una parte es sobre la configuración de Apache. El paso en 2. incluye su propia configuración httpd básicamente es:

sed -i 's/Listen 80/Listen '$PORT'/' /app/apache/conf/httpd.conf 
sed -i 's/^DocumentRoot/# DocumentRoot/' /app/apache/conf/httpd.conf 
sed -i 's/^ServerLimit 1/ServerLimit 8/' /app/apache/conf/httpd.conf 
sed -i 's/^MaxClients 1/MaxClients 8/' /app/apache/conf/httpd.conf 

for var in `env|cut -f1 -d=`; do 
    echo "PassEnv $var" >> /app/apache/conf/httpd.conf; 
done 
echo "Include /app/www/conf/httpd/*.conf" >> /app/apache/conf/httpd.conf 
touch /app/apache/logs/error_log 
touch /app/apache/logs/access_log 
tail -F /app/apache/logs/error_log & 
tail -F /app/apache/logs/access_log & 
export LD_LIBRARY_PATH=/app/php/ext 
export PHP_INI_SCAN_DIR=/app/www 
echo "Launching apache" 
exec /app/apache/bin/httpd -DNO_DETACH 

Espero que esto sea útil. Lo usé para .htaccess y para cambiar la raíz web.

Cuestiones relacionadas