2010-06-10 23 views
5

Tôi đang cố gắng lấy biểu mẫu đăng nhập tôi có trong django để chỉ cho phép ba lần đăng nhập trước khi chuyển hướng đến trang "trợ giúp đăng nhập". Tôi hiện đang sử dụng chế độ xem "django.contrib.auth.views.login" có sẵn với mẫu tùy chỉnh. Làm cách nào để buộc nó chuyển hướng đến một trang khác sau khi n lần đăng nhập thất bại?Làm cách nào để giới hạn số lần đăng nhập lại ở Django

Trả lời

-8

Bạn có thể lưu phiên nếu người dùng không đăng nhập được.

request.SESSION['login_tries'] = 1 

và nếu họ thất bại trong việc đăng nhập lại

request.SESSioN['login_tries'] = 2 

Nếu phiên giao dịch trở nên bằng với lượng đăng nhập cố bạn muốn họ tho có, sau đó làm điều gì đó.

+8

Phiên họp sẽ chỉ tồn tại nếu khách hàng đang gửi header Cookie, trong đó một lực lượng tấn công brute sẽ không được làm. Sẽ tốt hơn nếu liên kết các lần đăng nhập với một tài khoản người dùng cụ thể hoặc một khách hàng cụ thể (hoặc cả hai). –

10

Có thực sự là một dự án ra có cung cấp một middleware Django để làm điều này, được gọi là django-axes. Đơn giản chỉ cần cài đặt nó với các hướng dẫn được cung cấp và sau đó thiết lập AXES_LOGIN_FAILURE_LIMIT đến số lần đăng nhập bạn muốn trước khi một bản ghi được tạo cho các lần đăng nhập không thành công. Bạn vẫn sẽ phải kiểm tra hồ sơ này khi bạn muốn khóa ai đó ra, tuy nhiên.

+0

Cảm ơn Daniel. Tôi đã chọn câu trả lời của dotty vì nó gần với phương pháp mà tôi đã sử dụng. Một phần của vấn đề là sự thiếu kinh nghiệm của riêng tôi với Python và Django và vì vậy tôi không có đủ kiến ​​thức để đặt câu hỏi đúng. Tôi nghĩ câu trả lời của bạn sẽ tốt như thế nếu không tốt hơn nếu tôi muốn một cái gì đó với nhiều tính năng đó, và tôi cũng có thể sử dụng nó khi tôi quen thuộc hơn với khung công tác. –

+1

Đừng lo lắng, chỉ muốn cho bạn biết rằng có một giải pháp đã có sẵn có khả năng hoạt động. Tôi không biết nó tồn tại hoặc vì vậy tôi đã học được một cái gì đó trong quá trình này quá! –

0

tôi sử dụng django-brake và memcached

@ratelimit(field='email', method='POST', rate='5/m') 
@ratelimit(field='email', method='POST', rate='10/h') 
@ratelimit(field='email', method='POST', rate='20/d') 
def login_failure(request, login_form): 
    """ 
    Increment cache counters, 403 if over limit. 
    """ 
    was_limited = getattr(request, 'limited', False) 
    if was_limited: 
     limits = getattr(request, 'limits', []) 
     login_form.full_clean() 
     login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())\ 
      .append('accout locked, try '+ str(limits[0]['period']) + ' seconds later') 
     return render(request, 'user/login.html', {'form': login_form}) 


def login(request): 

    if request.method == 'GET': 
     next = request.GET.get('next', '') 
     return render(request, 'user/login.html', {'next': next}) 
    elif request.method == 'POST': 
     login_form = LoginForm(request.POST) 

     # check first 
     from brake.utils import get_limits 
     limits = get_limits(request, 'login_failure', 'email', [60, 3600, 86400]) 
     if limits: 
      login_form.full_clean() 
      login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())\ 
       .append('accout locked, try '+ str(limits[0]['period']) + ' seconds later') 
      return render(request, 'user/login.html', {'form': login_form}) 

     if login_form.is_valid(): 

       email = login_form.cleaned_data['email'] 
       submit_pwd = login_form.cleaned_data['password'] 

       user = authenticate(username=email, password=submit_pwd) 

       if user is None: 
        # 
        res = login_failure(request, login_form) 
        if res is None: 
         login_form._errors.setdefault(NON_FIELD_ERRORS, ErrorList()).append('password wrong') 
         res = render(request, 'user/login.html', {'form': login_form}) 
        return res 

       ... 
       login etc... 
     else: 

     ... 
Các vấn đề liên quan