How can I log both successful and failed login and logout attempts in Django?

前端 未结 2 1793
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-31 18:51

I want to record all user login and logout attempts in Django. This record should show a history of all users who logged in/out, IP address and time of login/logout.

The

2条回答
  •  难免孤独
    2021-01-31 19:29

    I have a new answer that has been integrated with Django user (AbstractUser) as below:

    model.py (Creating a model that inherits from Django user):

    from django.contrib.auth.models import AbstractUser
    from django.db import models
    
    class UserModel(AbstractUser):  # Inherit from django user
        last_logout = models.DateTimeField(null=True, blank=True)
        status = models.CharField(max_length=64)
        ip = models.GenericIPAddressField(null=True)
    
        def __str__(self):
            return '{} - {}'.format(self.username, self.ip)
    

    Signal.py (Recording to Django-model and to log):

    from django.contrib.auth.signals import user_logged_out
    from django.dispatch import receiver
    from django.utils import timezone
    from  import UserModel  # above model
    from logging import getLogger
    
    logger = getLogger(__name__)
    
    def get_client_ip(request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip
    
    
    @receiver(user_logged_out)
    def user_logged_out_callback(sender, request, user, **kwargs):
        ip = get_client_ip(request)
        username = request.user.username  # get the username.
        now = timezone.now()
        logger.warn('{} logged out with {} IP'.format(user, ip))  # recording to log
        UserModel.objects.filter(username=username).update(last_logout=now,
                                                       status='user_logged_out',
                                                       ip=ip
                                                       )  # recording to the model
    

    [NOTE]:

    • username is located in one of the AbstarctUser fields.

    • User login time is built-in Django AbstractUser. (Do not need to be implemented)

    • Also, you can implement login_faild in a similar way.


提交回复
热议问题