Skip to content
Snippets Groups Projects
auth.py 1.66 KiB
Newer Older
Piotr Gawron's avatar
Piotr Gawron committed
import logging

Jacek Lebioda's avatar
Jacek Lebioda committed
from django.contrib.auth import authenticate, login, logout
Piotr Gawron's avatar
Piotr Gawron committed
from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
from django.dispatch import receiver

logger = logging.getLogger(__name__)
Jacek Lebioda's avatar
Jacek Lebioda committed


def do_login(request):
Piotr Gawron's avatar
Piotr Gawron committed
    user_login = request.POST.get('username', 'none')
    user = authenticate(username=user_login,
                        password=request.POST.get('password', 'none'))
    if user is not None:
        login(request, user)
        return True, "ok"
Piotr Gawron's avatar
Piotr Gawron committed
    else:
        return False, "login_failed"
Jacek Lebioda's avatar
Jacek Lebioda committed


def do_logout(request):
    if request.user.is_authenticated:
        logout(request)
        return True, "logout"
    return False, "logout_failed"
Piotr Gawron's avatar
Piotr Gawron committed


# code that put in logs every successful and problematic login/logout event
# https://stackoverflow.com/questions/37618473/how-can-i-log-both-successful-and-failed-login-and-logout-attempts-in-django
@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')
    logger.info('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')

    logger.info('logout user: {user} via ip: {ip}'.format(
        user=user,
        ip=ip
    ))


@receiver(user_login_failed)
def user_login_failed_callback(sender, credentials, **kwargs):
    logger.warning('login failed for: {credentials}'.format(
        credentials=credentials,
    ))