В то время как мой запуск в темном режиме, я хочу получить доступ, кроме доступа к странице /, чтобы перейти на страницу поиска, где пользователи вводят пароль, предоставленный им представителем. Для выполнения задачи я придумал следующее промежуточное программное обеспечение. Чтобы быть ясным, это должно гарантировать, что пользователи согласятся держать сайт в уверенности, прежде чем им разрешат просматривать, а не использовать в качестве системы безопасности или клонирования .htaccess. Однако я бы хотел, чтобы они не видели какие-либо общедоступные страницы (то есть те, которые не были украшены @login_required), не зная пароль screener. Функция password_check использует Django Auth для генерации хэша входного пароля для проверки на значение db.
Любые мысли/методы обхода, которые вы, ребята, видите? Одна из моих идей заключалась в том, чтобы изменить функцию входа в систему, чтобы выпустить LicenceKey на сеанс недавно зарегистрированных пользователей, вместо того, чтобы предоставлять пользователям доступ к учетным записям. Однако, поскольку они могут создавать новый сеанс только путем входа в систему, и вход в систему требует согласования с клишером, он кажется лишним.
Обратная связь оценена.
Среднее ПО выглядит следующим образом:
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
import re
class LicenceScreener(object):
SCREENER_PATH = reverse("licence")
INDEX_PATH = reverse("index")
LICENCE_KEY = "commercial_licence"
def process_request(self, request):
""" Redirect any access not to the index page to a commercial access screener page
When the screener form is submitted, request.session[LICENCE_KEY] is set.
"""
if not LicenceScreener.LICENCE_KEY in request.session \
and not request.user.is_authenticated() \
and LicenceScreener.SCREENER_PATH != request.path\
and LicenceScreener.INDEX_PATH != request.path:
return HttpResponseRedirect(self.SCREENER_PATH)
И вид выглядит следующим образом:
def licence(request):
c = RequestContext(request, {} )
if request.method == 'POST':
form = LicenceAgreementForm(request.POST)
if form.is_valid():
if password_check(form.cleaned_data["password"]):
request.session[LicenceScreener.LICENCE_KEY] = True
return HttpResponseRedirect(reverse("real-index"))
else:
form._errors["password"] = form.error_class([_("Sorry that password is incorrect")])
else:
form = LicenceAgreementForm()
c["form"] = form
return render_to_response('licence.html',c)
РЕДАКТИРОВАТЬ 1. Удалены регулярные выражения, как было предложено Tobu