Что хотелось?
Хотелось сделать шифрование на странице логина и регистрации принудительное, а шифрование других страниц по выбору пользователя
Что надо сделать ?
- Установить настройки в nginx и создать ключ. Инструкция дана здесь http://wiki.enchtex.info/howto/nginx_ssl
- В настройках nginx не забыть добавить параметр для fastcgi, чтобы в django можно было получать переменную os.environ['HTTPS']. Добавляется такой параметр: fastcgi_param HTTPS on;
- В django добавляем middleware такого вида (основная реализация позаимстована отсюда: http://www.djangosnippets.org/snippets/240/):
SSL = 'SSL'
class SSLRedirectMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
if SSL in view_kwargs:
secure = view_kwargs[SSL]
del view_kwargs[SSL]
else:
secure = False
user = request.user
if user.is_authenticated():
try:
profile = user.get_profile()
secure = profile.is_secure
except:
pass
if not secure == self._is_secure(request):
return self._redirect(request, secure)
def _is_secure(self, request):
if request.is_secure():
return True
#Handle the Webfaction case until this gets resolved in the request.is_secure()
if 'HTTP_X_FORWARDED_SSL' in request.META:
return request.META['HTTP_X_FORWARDED_SSL'] == 'on'
return False
def _redirect(self, request, secure):
protocol = secure and "https" or "http"
newurl = "%s://%s%s" % (protocol, get_host(request), request.get_full_path())
if settings.DEBUG and request.method == 'POST':
raise RuntimeError, \
"""Django can't perform a SSL redirect while maintaining POST data.
Please structure your views so that redirects only occur during GETs."""
return HttpResponsePermanentRedirect(newurl) - Во views для login я указал такую функцию
from django.views.decorators.csrf import csrf_exempt
т.к. я не смог победить проблему совместимости csrf + https
@csrf_exempt
def secure_login(request, *args, **kwargs):
return simple_login(request, *args, **kwargs) - Осталось только в urls.py указать
url(r'^login/$', 'apps.accounts.views.secure_login',
Здесь стоит обратить внимание на посылку параметра SSL=True
{'template_name': 'registration/login.html',
'redirect_field_name': REDIRECT_FIELD_NAME,
'authentication_form': AuthenticationForm, 'SSL': True},
name='auth_login'),
Комментариев нет:
Отправить комментарий