Я собираюсь разместить в Интернете бета-версию сайта, над которым я работаю. Для ограничения доступа необходим бета-код. Сайт написан на django.
Я не хочу менять фундаментальную систему Auth для размещения бета-кода, и меня особо не волнует, что безопасность бета-кода железная, просто это серьезный камень преткновения.
Как мне это сделать? Это довольно большой проект, поэтому добавление кода в каждое представление далеко от идеала.
Это решение работает хорошо. Класс промежуточного программного обеспечения I получил следующее:
from django.http import HttpResponseRedirect
class BetaMiddleware(object):
"""
Require beta code session key in order to view any page.
"""
def process_request(self, request):
if request.path != '/beta/' and not request.session.get('in_beta'):
return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))






Вы должны иметь возможность добавлять декораторы @login_required по всем направлениям и покончить с этим. Если у вас нет большого количества функций просмотра, это не должно быть слишком ужасно.
@defrex, создайте собственный декоратор login_required, который обертывает встроенную версию Django. Когда вы начнете жить, просто замените его полностью на Django.
Вероятно, вы можете ограничить доступ ко всему сайту через apache с помощью htaccess, полностью исключив проблему из пространства проекта django.
Сделайте то, что сделал StackOverflow.
У них была простая форма электронной почты / пароля. У него был один жестко закодированный пароль (falkensmaze). Когда пользователь получит правильный пароль, установите cookie. например. auth = 1
Не беспокойтесь о том, что это небезопасно. Какая разница, если кто-то взломает бета-версию?
Apache / htaccess - тоже хорошее и простое решение.
Это означает, что я должен проверять наличие файла cookie в каждом представлении. Я бы предпочел избегать добавления кода в каждое представление. Есть ли способ проверить файл cookie глобально в django?
@defrex да с промежуточным программным обеспечением. См. Ответ AdamKG.
Начните с этот фрагмент Django, но измените его, чтобы проверить request.session['has_beta_access']. Если у них его нет, то попросите его вернуть перенаправление на страницу «введите бета-код», которая при отправке с правильным кодом устанавливает для этой переменной сеанса значение True.
Чтобы сделать его общедоступной бета-версией, нужно просто удалить это промежуточное ПО из настроек MIDDLEWARE_CLASSES.
Я не уверен, какую версию кода Pinax вы используете, но они встроили возможность закрыть сайт для частной бета-версии, поэтому вам не нужно много работать самостоятельно.
Ссылка на конкретный шаблон проекта для частного бета-сайта находится здесь: http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project, хотя я думаю, что с тех пор они могли добавить эту функциональность во все шаблоны проектов.
Действительно старая версия pinax. Вопрос был задан в сентябре 08. Это хороший момент, поэтому я убрал ссылку на pinax из вопроса, чтобы люди не вводились в заблуждение.
Отличный фрагмент, но он вызвал у меня множество проблем, связанных с сессиями OpenId. В итоге я полагаюсь на файлы cookie вместо сеанса:
class BetaMiddleware(object):
"""
Require beta code cookie key in order to view any page.
"""
set_beta = False
def process_request(self, request):
referer = request.META.get('HTTP_REFERER', '')
if request.method == 'GET' and not 'is_in_beta' in request.COOKIES:
return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))
if request.method == 'POST' and 'pass' in request.POST:
code = request.POST['pass']
if code=='beta':
self.set_beta = True
return HttpResponseRedirect('%s' % '/')
def process_response(self, request, response):
if self.set_beta is True:
response.set_cookie('is_in_beta', '1')
return response
Это небезопасно, но мне этого достаточно. Это также работает только с бета-страницей html.
используйте это промежуточное ПО:
class BetaForm(Form):
beta_pass = CharField(required=True)
def clean_beta_pass(self):
data = self.cleaned_data['beta_pass']
if data != settings.BETA_PASS:
raise forms.ValidationError("Invalid Beta pass!")
return data
class BetaView(FormView):
form_class = BetaForm
template_name = "beta.html"
def form_valid(self, form):
response = HttpResponseRedirect(self.request.GET.get("next", "/"))
response.set_cookie(settings.BETA_PASS, '')
return response
def beta_middleware(get_response):
def middleware(request):
if request.path == reverse("beta"):
return get_response(request)
else:
if settings.BETA_PASS in request.COOKIES:
return get_response(request)
else:
return HttpResponseRedirect(
'%s?%s' % (reverse("beta"), urlencode({"next": request.get_full_path()})))
return middleware
этот шаблон:
<!doctype html>
<title>Welcome to the beta!</title>
<style>
body { text-align: center; padding: 150px; }
h1 { font-size: 50px; }
body { font: 20px Helvetica, sans-serif; color: #333; }
article { display: block; text-align: left; width: 650px; margin: 0 auto; }
a { color: #dc8100; text-decoration: none; }
a:hover { color: #333; text-decoration: none; }
</style>
<article>
<h1>>Welcome to the beta lucky user!</h1>
<div>
<form method = "POST">
{% csrf_token %}
{{form}}
<input type = "submit">
</form>
</div>
</article>
это настройки:
BETA_PASS = "beta"
этот путь:
path("beta",BetaView.as_view(),name = "beta"),
Проблема в том, что тогда тот, кто пытается получить доступ, попадает на страницу входа, а не на страницу для ввода бета-кода. На странице входа есть все меню и пользовательский интерфейс вокруг нее. Я бы хотел пока сохранить это в секрете.