11

我即将在网络上发布我正在开发的网站的测试版。它需要有一个测试代码来限制访问。该网站是用 django 编写的。

我不想改变基本的 Auth 系统以适应 beta 代码,我也不特别关心 beta 代码的安全性是铁定的,只是它是一个重要的绊脚石。

我该怎么做?这是一个相当大的项目,因此向每个视图添加代码远非理想。


该解决方案效果很好。我最终得到的中间件类是这样的:

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

7 回答 7

21

从这个 Django 片段开始,但修改它以检查request.session['has_beta_access']。如果他们没有,则让它返回一个重定向到“输入 beta 代码”页面,当使用正确的代码发布到该页面时,将该会话变量设置为True.

然后将其设为公开测试版,只需从您的MIDDLEWARE_CLASSES设置中删除该中间件即可。

于 2008-09-19T22:43:40.303 回答
4

您可能可以使用 htaccess 通过 apache 限制对整个站点的访问,从而将问题完全排除在 django 的项目空间之外。

于 2008-09-19T21:25:38.990 回答
2

做 StackOverflow 所做的。

他们有一个简单的电子邮件/密码表格。它有一个硬编码密码(falkensmaze)。当用户获得正确的密码时设置一个cookie。例如。授权=1

不用担心它不安全。谁在乎是否有人入侵了测试版?

Apache/htaccess 也是一个不错且简单的解决方案。

于 2008-09-19T21:51:26.403 回答
0

您应该能够全面添加@login_required装饰器并完成它。除非你有大量的视图功能,否则它不应该太可怕。

于 2008-09-19T21:24:56.670 回答
0

我不确定您使用的是哪个版本的 Pinax 代码,但它们内置了关闭网站以进行私人测试版的功能,因此您无需自己做太多工作。

私人测试版网站的特定项目模板的链接在这里:http: //github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project尽管我认为他们可能已经将该功能添加到所有项目中模板。

于 2009-08-08T17:56:36.847 回答
0

很棒的片段,但它给我带来了很多与 OpenId 相关的问题。所以我最终依赖 Cookies 而不是 Session:

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

这并不安全,但这对我来说已经足够了。这也仅适用于 beta html 页面。

于 2009-11-20T14:47:12.457 回答
0

使用这个中间件:

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"),
于 2020-01-17T15:25:53.870 回答