You can connect to the provided signals: django.contrib.auth.signals
Logging
import logging from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed from django.dispatch import receiver log = logging.getLogger(__name__) @receiver(user_logged_in) def user_logged_in_callback(sender, request, user, **kwargs): # 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') log.debug('login user: {user} via ip: {ip}'.format( user=user, ip=ip )) @receiver(user_logged_out) def user_logged_out_callback(sender, request, user, **kwargs): ip = request.META.get('REMOTE_ADDR') log.debug('logout user: {user} via ip: {ip}'.format( user=user, ip=ip )) @receiver(user_login_failed) def user_login_failed_callback(sender, credentials, **kwargs): log.warning('logout failed for: {credentials}'.format( credentials=credentials, ))
Writing to a Model / Database
Since this answer has not yet been accepted, here is an example that hurts actions in the model, rather than logging:
Model
# <your_app>/models.py from django.db import models from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed from django.dispatch import receiver class AuditEntry(models.Model): action = models.CharField(max_length=64) ip = models.GenericIPAddressField(null=True) username = models.CharField(max_length=256, null=True) def __unicode__(self): return '{0} - {1} - {2}'.format(self.action, self.username, self.ip) @receiver(user_logged_in) def user_logged_in_callback(sender, request, user, **kwargs): ip = request.META.get('REMOTE_ADDR') AuditEntry.objects.create(action='user_logged_in', ip=ip, username=user.username) @receiver(user_logged_out) def user_logged_out_callback(sender, request, user, **kwargs): ip = request.META.get('REMOTE_ADDR') AuditEntry.objects.create(action='user_logged_out', ip=ip, username=user.username) @receiver(user_login_failed) def user_login_failed_callback(sender, credentials, **kwargs): AuditEntry.objects.create(action='user_login_failed', username=credentials.get('username', None))
Administrator
# <your_app>/admin.py from django.contrib import admin from models import AuditEntry @admin.register(AuditEntry) class AuditEntryAdmin(admin.ModelAdmin): list_display = ['action', 'username', 'ip',] list_filter = ['action',]