feat: login failed log

This commit is contained in:
XIE7654
2025-10-12 10:12:48 +08:00
parent 969be9904c
commit f033142c21
2 changed files with 57 additions and 35 deletions

View File

@@ -1,7 +1,6 @@
import requests import requests
from celery import shared_task from celery import shared_task
from django.utils import timezone
from system.models import LoginLog, User from system.models import LoginLog, User
@@ -10,23 +9,14 @@ def add(x, y):
return x + y return x + y
@shared_task @shared_task
def update_user_login_info(user_id, client_ip, user_agent): def update_user_login_info(username, client_ip, user_agent, result):
# 更新用户登录信息
user = User.objects.get(id=user_id)
user.login_ip = client_ip
user.last_login = timezone.now()
user.save(update_fields=['login_ip', 'last_login'])
# 获取地理位置信息 # 获取地理位置信息
location_info = get_location_from_ip(client_ip) location_info = get_location_from_ip(client_ip)
# location_info = None
# 记录登录日录 # 记录登录日录
LoginLog.objects.create( LoginLog.objects.create(
username=user.username, username=username,
result=LoginLog.LoginResult.SUCCESS, result=result,
user_ip=client_ip, user_ip=client_ip,
location=location_info, location=location_info,
user_agent=user_agent user_agent=user_agent

View File

@@ -1,15 +1,17 @@
import requests import requests
from rest_framework import serializers from rest_framework import serializers, status
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from django.utils import timezone
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from system.tasks import update_user_login_info from system.tasks import update_user_login_info
from system.models import User, Menu, Dept from system.models import User, Menu, Dept, LoginLog
from utils.ip_utils import get_client_ip from utils.ip_utils import get_client_ip
from utils.models import CommonStatus
from utils.serializers import CustomModelSerializer from utils.serializers import CustomModelSerializer
from utils.custom_model_viewSet import CustomModelViewSet from utils.custom_model_viewSet import CustomModelViewSet
@@ -52,18 +54,33 @@ class UserLogin(ObtainAuthToken):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data, serializer = self.serializer_class(data=request.data,
context={'request': request}) context={'request': request})
client_ip = get_client_ip(request)
username = request.data.get('username', '')
try:
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user'] user = serializer.validated_data['user']
if user.status == CommonStatus.DISABLED:
update_user_login_info.delay(
username,
client_ip,
request.META.get('HTTP_USER_AGENT', ''),
LoginLog.LoginResult.FAILED
)
return Response({
"code": 1,
"data": None,
"message": "登录失败, 用户被禁用"
})
token, created = Token.objects.get_or_create(user=user) token, created = Token.objects.get_or_create(user=user)
user.login_ip = client_ip
# 获取真实IP地址 user.last_login = timezone.now()
client_ip = get_client_ip(request) user.save(update_fields=['login_ip', 'last_login'])
# 异步处理用户登录信息更新和日志记录 # 异步处理用户登录信息更新和日志记录
update_user_login_info.delay( update_user_login_info.delay(
user.id, username,
client_ip, client_ip,
request.META.get('HTTP_USER_AGENT', '') request.META.get('HTTP_USER_AGENT', ''),
LoginLog.LoginResult.SUCCESS
) )
user_data = UserSerializer(user).data user_data = UserSerializer(user).data
@@ -76,6 +93,21 @@ class UserLogin(ObtainAuthToken):
"message": "ok" "message": "ok"
}) })
except Exception as e:
# 记录登录失败日志
update_user_login_info.delay(
username,
client_ip,
request.META.get('HTTP_USER_AGENT', ''),
LoginLog.LoginResult.FAILED
)
return Response({
"code": 1,
"data": None,
"message": "登录失败, 用户名或密码错误"
})
def get_location_from_ip(self, ip): def get_location_from_ip(self, ip):
"""根据IP地址获取地理位置信息""" """根据IP地址获取地理位置信息"""
try: try: