11

私が取り組んでいるサイトのベータ版を Web にアップしようとしています。アクセスを制限するには、ベータ コードが必要です。このサイトは django で書かれています。

ベータ コードに対応するために基本的な Auth システムを変更したくはありません。また、ベータ コードのセキュリティが鉄壁であることは特に気にしません。ただ、それが重大な障害になるだけです。

どうすればいいですか?これはかなり大規模なプロジェクトであるため、すべてのビューにコードを追加するのは理想的ではありません。


その解決策はうまくいきます。私がこれで終わったミドルウェアクラス:

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']。持っていない場合は、「ベータコードを入力」ページへのリダイレクトを返してもらい、正しいコードで投稿すると、そのセッション変数が に設定され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

使用しているPinaxコードのバージョンはわかりませんが、プライベートベータ用にサイトを閉鎖する機能が組み込まれているため、自分で多くの作業を行う必要はありません。

プライベートベータサイトの特定のプロジェクトテンプレートへのリンクは次のとおりです: http: //github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_projectその後、すべてのプロジェクトにその機能が追加された可能性がありますテンプレート。

于 2009-08-08T17:56:36.847 に答える
0

すばらしいスニペットですが、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 ページでも機能します。

于 2009-11-20T14:47:12.457 に答える
0

@login_requiredボード全体にデコレータを追加して、それで完了できるはずです。大量のビュー機能を持っていない限り、それほどひどいものではないはずです。

于 2008-09-19T21:24:56.670 に答える
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 に答える