Django для отлова всех недействительных логинов и несанкционированного доступа, таких как 401s и 403s

Я хочу перехватывать все недействительные логины/неавторизованный доступ, такие как 401s и 403s, возвращаемые с сайта, чтобы я мог регистрировать их в службе регистрации безопасности, выясняя, есть ли простой способ перехватить все это без использования пользовательской логики.

Я пробовал использовать промежуточный подход:

def simple_middleware(get_response):
    # One-time configuration and initialization.

    def middleware(request):

        response = get_response(request)

        if response.status_code in [403, 401]:
            log.warning('invalid login')

        return response

    return middleware

К сожалению, неправильный вход в /admin/ логин, он возвращает статус 200, однако я думаю, что это будет работать для пользовательского логина, который явно бросает 401/403.

Я также пытался использовать подход с использованием сигнала, используя request_finished, но все, что я получаю, это только класс обработчика.

Итак... ищу идеи.

Как вы выяснили, попытка входа в систему не обязательно подразумевает определенный код ответа, поскольку вы можете решить обработать попытку редиректом или любым другим типом ответа.

В случае Django, стандартное промежуточное ПО auth (которое, как я предполагаю, вы используете) запускает сигнал user_login_failed, который вы можете обработать с помощью вашей логики логирования.

Вы можете посмотреть в документации как зарегистрировать обработчик сигнала, поэтому это должно быть что-то вроде

from django.contrib.auth.signals import user_login_failed
from django.dispatch import receiver

@receiver(request_finished)
def handle_login_failed(sender, **kwargs):
    print(f"Oops, login failed using these credentials: {kwargs.get('credentials', None)}")

Триггер сигнала находится в исходном коде пакета auth.

Вернуться на верх