2017-01-15 17 views
1

背景:私は私のDjangoのアプリでレート制限のための多目的django-brakeを使用してい拡張ログイン機能(Djangoプロジェクト)

。私は今私のアプリで無差別なログイン試行を制限するように設定する必要があります。

これを行う方法は、loginビューをデコレータratelimit(field='username')で飾り、ビュー内にwas_limited = getattr(request, 'limited', False)を追加することです。 was_limitedは、同じユーザー名(OR IP)が5回以上使用される場合はTrueです。一つは、その後など、ユーザーを怒らリダイレクトすることができ

SCENARIO:

現在、私はdjango.contrib.auth.viewslogin機能を使用しています。私はこの機能を私のurls.pyで飾ることができます。しかし、私はその方法の中にwas_limited = getattr(request, 'limited', False)を含めることはできません。それは重要なことです。そのフラグが一度しかTrueであると、問題のユーザーに対して措置を講じることができます。

QUESTION:

だから、私は上記の機能を含めるには、この機能を飾るし、拡張するための最良の方法は何ですか?すべてを無効にする必要がありますか?お知らせ下さい。私は直接django.contrib.auth.viewsに必要なコードを書くことができますが、それはハックです。

初心者であるので、私はこのような状況に対処する最善の方法を考え出しています。説明的な例が良いでしょう。参考のため


、私は以下のdjango.contrib.auth.views.loginを含めている:

@sensitive_post_parameters() 
@csrf_protect 
@never_cache 
def login(request, template_name='registration/login.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      authentication_form=AuthenticationForm, 
      current_app=None, extra_context=None): 
    """ 
    Displays the login form and handles the login action. 
    """ 
    redirect_to = request.REQUEST.get(redirect_field_name, '') 

    if request.method == "POST": 
     form = authentication_form(data=request.POST) 
     if form.is_valid(): 

      # Ensure the user-originating redirection url is safe. 
      if not is_safe_url(url=redirect_to, host=request.get_host()): 
       redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL) 

      # Okay, security check complete. Log the user in. 
      auth_login(request, form.get_user()) 

      if request.session.test_cookie_worked(): 
       request.session.delete_test_cookie() 

      return HttpResponseRedirect(redirect_to) 
    else: 
     form = authentication_form(request) 

    request.session.set_test_cookie() 

    current_site = get_current_site(request) 

    context = { 
     'form': form, 
     redirect_field_name: redirect_to, 
     'site': current_site, 
     'site_name': current_site.name, 
    } 
    if extra_context is not None: 
     context.update(extra_context) 
    return TemplateResponse(request, template_name, context, 
          current_app=current_app) 

答えて

0

すべての作業はすでに物事のルックスで、デコレータで行われます。この例では、リクエスト内に余分なものを追加したいと思っている場合は、リクエストが以前は制限されていたと言いますが、そうする必要はありませんし、機能には影響しません。

+0

ああいいえ。 'was_limited'フラグにアクセスできない限り、実際にリダイレクトすることはできません。レートリミットに達すると、フラグは「True」に変わります。 –

0

これを試してみました。 https://docs.djangoproject.com/en/1.10/topics/auth/default/

def my_login(request,*args,**kwargs): 
    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     if username and password: 
      user = authenticate(username=username, password=password) 
      if user: 
       login(request, user) 
       return redirect('/home') 
      else: 
       return render(request, 'login.html') 
     else: 
      return render(request, 'login.html') 

    return render(request, 'login.html') 
関連する問題