2017-01-15 3 views
1

배경 : 내 장고 응용 프로그램에서 속도 제한에 대한 다양한 django-brake을 사용하고확장 로그인 기능 (장고 프로젝트)

. 이제는 앱에서 무차별 로그인 시도를 제한하도록 구성해야합니다.

login보기를 데코레이터 ratelimit(field='username')으로 장식하고보기 내에 was_limited = getattr(request, 'limited', False)을 추가하는 것이 좋습니다. was_limited은 동일한 사용자 이름 (OR IP)이> 5 번/분으로 사용되는 경우 True입니다. 하나는 등, 사용자의 기분을 상하게 리디렉션 할 수 있습니다

시나리오 :

는 현재, 내가 django.contrib.auth.viewslogin 기능을 사용하고 있습니다. 내 urls.py 에이 함수를 장식 할 수 있습니다. 그러나 나는 그 방법으로 함수 안에 was_limited = getattr(request, 'limited', False)을 포함시킬 수 없다. 그리고 그 플래그가 True 일 때만 문제가되는 사용자를 상대로 조치를 취할 수 있기 때문에 이는 업무상 중요한 문제입니다.

질문 :

그래서 장식과 위의 기능을 포함하도록이 기능을 확장하는 가장 좋은 방법은 무엇입니까? 모든 것을 무시해야합니까? 그렇다면 어떻게해야합니까? 제발 조언. 내가 직접 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

모든 작업이 이미 사물의 외모, 데코레이터에서 이루어집니다. 보기에 이전에 요청이 제한되어 있다고 말할 수있는 추가 작업을 원한다면 예제에 was_limited을 추가하는 것으로 나타 났지만 그렇게 할 필요가 없으며 기능에 아무런 영향을 미치지 않습니다.

+0

아 아니요. 'was_limited' 플래그에 액세스 할 수 없다면 실제로 리디렉션 할 수 없으며 문제가되는 사용자에 대해 어떤 종류의 작업을 수행 할 수 없습니다. 속도 제한에 도달하면 플래그가 '참'으로 바뀝니다. –

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