Что хотелось?
Хотелось сделать шифрование на странице логина и регистрации принудительное, а шифрование других страниц по выбору пользователя
Что надо сделать ?
- Установить настройки в 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'),
 
Комментариев нет:
Отправить комментарий