2015-03-02 15 views
6

Kullanıcı IP adresini, giriş, çıkış ve başarısız oturum açma olayları için özellikle Django uygulamasında oturum açmak istiyorum.Django günlük kullanıcı user_login_failed sinyali için IP

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) 

konu bu fonksiyon parametrelerinde request olmadığı için user_login_failed sinyali için IP almak için bir yol bulmuş değil olmasıdır (https://docs.djangoproject.com/en/1.7/ref/contrib/auth/#module-django.contrib.auth.signals) şu şekildedir: Django yerleşik işlevleri kullanıyorum . credentials parametresi, yalnızca username ve password alanlarını içeren bir sözlüktür.

Bu sinyalin IP adresini nasıl alabilirim?

Yardımlarınız için şimdiden çok teşekkürler.

cevap

0

Sen giriş formunu geçersiz kılmak ve orada yolunu kesmek olabilir. Bu aşamada istek var.

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 

o

ben şöyle Uygulamanızın hazır() yönteminde yapıyor öneririz django.contrib.admin.site.login_form için Eklemek gerekir siteye yüklemek için:

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