feat: login failed log
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user