2012-02-22 36 views
11

Tiêu đề khá nhiều tổng kết cho câu hỏi của tôi. Tôi muốn mật khẩu bảo vệ một số tập tin trong ứng dụng django của tôi sống trên heroku.
Nếu tôi không thể sử dụng htaccess thì có ai có đề xuất về những gì khác tôi có thể sử dụng không? Cảm ơn.htaccess trên heroku cho ứng dụng django

+1

Tôi không muốn sử dụng bất cứ điều gì django cụ thể bởi vì tôi có một máy chủ thử nghiệm, sản xuất và demo để đối phó với – mea36

+0

Tại sao không sử dụng 'SITE_ID' và khung trang web để phân biệt? – Josh

Trả lời

16

Như @mipadi nói, bạn không thể sử dụng htaccess trên Heroku, nhưng bạn có thể tạo ra một middleware cho rằng:

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() 

Sau đó, bạn cần phải xác định trong settings.py:

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

Điều này hiệu quả. Làm thế nào tôi có thể chỉnh sửa để nó chỉ hoạt động cho các url cụ thể? – mea36

+2

Tôi thực sự đã tìm ra điều này bằng cách sử dụng request.META ['PATH_INFO'] để kiểm tra url và trả lại nếu tôi không muốn mật khẩu url đó được bảo vệ – mea36

+0

Tuyệt vời, tôi rất vui được trợ giúp. –

-2

Bạn không thể sử dụng .htaccess, vì ứng dụng Heroku không được phân phát cùng với Apache. Tuy nhiên, bạn có thể sử dụng Django authentication.

Hoặc bạn có thể phân phát tệp từ một máy chủ khác bằng cách sử dụng Apache.

+0

Tôi đã sử dụng django auth trong ứng dụng – mea36

+1

Ai nói rằng các ứng dụng Heroku không được phục vụ với Apache? Tôi có một cấu hình apache hoạt động tốt. Câu trả lời của bạn thuộc về chồng nào? Tôi không có vấn đề gì khi sử dụng các tập tin .htaccess trên tuyết tùng, thiết lập cơ bản là [tài liệu trên blog của tôi] (http://hakre.wordpress.com/2012/05/20/php-on-heroku-again/) trong trường hợp Nó thật thú vị. – hakre

+0

@hakre: Hầu hết các ngăn xếp đều sử dụng nginx. Có lẽ các buildpack PHP làm một cái gì đó khác nhau. – mipadi

8

tôi đã có thể sử dụng các tệp .htaccess trên heroku với ngăn xếp tuyết tùng.

  1. Procfile nhu cầu để xác định một kịch bản cho các nút web:

    web: sh www/conf/web-boot.sh 
    
  2. Các conf/web-boot.sh slipstreams bao gồm của một tập tin cấu hình apache, ví dụ:

  3. Một conf/httpd/default.conf sau đó có thể cho phép ghi đè, như bạn biết từ apache.

Sau đó, bạn chỉ có thể sử dụng các tệp .htaccess. Toàn bộ quá trình được ghi lại chi tiết trong bài đăng blog của tôi PHP on Heroku again trong đó một phần là về cấu hình apache. Bước 2. bao gồm cấu hình httpd của chính bạn về cơ bản là:

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 

Tôi hy vọng điều này hữu ích. Tôi đã sử dụng nó cho .htaccess và để thay đổi webroot.

Các vấn đề liên quan