2015-03-02 16 views
6

मैं अपने Django एप्लिकेशन में विशेष रूप से लॉगिन, लॉगआउट और असफल लॉगिन ईवेंट के लिए उपयोगकर्ता आईपी पता लॉग करना चाहता हूं। मैं Django builtin कार्यों का उपयोग कर रहा इस प्रकार है:उपयोगकर्ता_login_failed सिग्नल के लिए Django लॉग उपयोगकर्ता आईपी

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) 

मुद्दा यह है कि मैं के बाद से इस समारोह मापदंडों में request नहीं है user_login_failed संकेत के लिए आईपी प्राप्त करने के लिए एक तरह से नहीं मिला है है (https://docs.djangoproject.com/en/1.7/ref/contrib/auth/#module-django.contrib.auth.signals) । credentials पैरामीटर एक शब्दकोश है जिसमें केवल username और password फ़ील्ड शामिल हैं।

मुझे इस सिग्नल के लिए आईपी पता कैसे मिल सकता है?

आपकी सहायता के लिए अग्रिम धन्यवाद।

उत्तर

3

दुर्भाग्यवश user_login_failed सिंगल तर्क के रूप में अनुरोध पास नहीं करते हैं।

चेकआउट django-axes - https://github.com/django-pci/django-axes/

यह विफल रहा है प्रवेशों को ट्रैक करने के लिए एक कस्टम दृश्य डेकोरेटर का उपयोग करता है।

https://github.com/django-pci/django-axes/blob/master/axes/decorators.py#L273

0

आप लॉगिन प्रपत्र ओवरराइड और वहाँ इसे रोकने सकता है। इस चरण में इसका अनुरोध है।

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 

यह साइट पर आप साथ जोड़ने की आवश्यकता में स्थापित करने के लिए यह django.contrib.admin.site.login_form को

मैं बहुत की तरह आपके ऐप्लिकेशन के लिए तैयार() विधि में यह कर सुझाव है:

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 
संबंधित मुद्दे