2015-03-02 29 views
6

Tôi muốn đăng nhập địa chỉ IP của người dùng trong ứng dụng Django của tôi, đặc biệt cho các sự kiện đăng nhập, đăng xuất và đăng nhập không thành công. Tôi đang sử dụng Django chức năng được xây dựng trong như sau:IP người dùng đăng nhập Django cho tín hiệu user_login_failed

from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed 
from ipware.ip import get_ip 
import logging 

logger = logging.getLogger(__name__) 

def log_logged_in(sender, user, request, **kwargs): 
    logger.info("%s User %s successfully logged in" % (get_ip(request), user)) 

def log_logged_out(sender, user, request, **kwargs): 
    logger.info("%s User %s successfully logged out" % (get_ip(request), user)) 

def log_login_failed(sender, credentials, **kwargs): 
    logger.warning("%s Authentication failure for user %s" % ("...IP...", credentials['username'])) 

user_logged_in.connect(log_logged_in) 
user_logged_out.connect(log_logged_out) 
user_login_failed.connect(log_login_failed) 

Vấn đề là tôi đã không tìm thấy một cách để có được IP cho các tín hiệu user_login_failed kể từ khi chức năng này không có request trong các thông số (https://docs.djangoproject.com/en/1.7/ref/contrib/auth/#module-django.contrib.auth.signals) . Thông số credentials là từ điển chỉ chứa các trường usernamepassword.

Làm cách nào để nhận địa chỉ IP cho tín hiệu này?

Rất cám ơn trước sự giúp đỡ của bạn.

Trả lời

0

Bạn có thể ghi đè biểu mẫu đăng nhập và chặn nó ở đó. Nó có yêu cầu ở giai đoạn đó.

import logging 
from django.contrib.admin.forms import AdminAuthenticationForm 
from django import forms 

log = logging.getLogger(__name__) 


class AuthenticationForm(AdminAuthenticationForm): 
    def clean(self): 
     # to cover more complex cases: 
     # http://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django 
     ip = request.META.get('REMOTE_ADDR') 
     try: 
      data = super(AuthenticationForm, self).clean() 
     except forms.ValidationError: 
      log.info('Login Failed (%s) from (%s)', self.cleaned_data.get('username'), ip) 
      raise 

     if bool(self.user_cache): 
      log.info('Login Success (%s) from (%s)', self.cleaned_data.get('username'), ip) 
     else: 
      log.info('Login Failed (%s) from (%s)', self.cleaned_data.get('username'), ip) 

     return data 

Để cài đặt nó vào trang web của bạn cần phải gắn nó vào django.contrib.admin.site.login_form

tôi sẽ đề nghị làm việc đó trong phương pháp sẵn sàng() của App của bạn như vậy:

from django.contrib.admin import site as admin_site 

class Config(AppConfig): 
    ... 

    def ready(self): 
     # Attach the logging hook to the login form 
     from .forms import AuthenticationForm 
     admin_site.login_form = AuthenticationForm 
Các vấn đề liên quan