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.