Become a sponsor

登录日志
登录日志记录每次登录尝试(成功/失败),包含登录账号、IP地址、浏览器信息、登录时间等。登录逻辑位于 application/login/services.py,日志记录位于 application/login_log/ 模块。
登录日志在以下时机自动记录:
1. 登录成功 -> 记录成功日志(status=0, logType=1)
2. 登录失败(密码错误)-> 记录失败日志(status=1, logType=1)
3. 登录失败(用户不存在)-> 记录失败日志(status=1, logType=1)
4. 登录失败(验证码错误)-> 记录失败日志(status=1, logType=1)
5. 退出登录 -> 记录成功日志(status=0, logType=2)| 字段 | 类型 | 说明 |
|---|---|---|
username | str | 登录账号 |
logType | int | 日志类型:1-登录 2-退出 |
source | int | 登录来源:0-后台系统 1-手机站 2-客户端 |
method | str | 请求方法 |
requestMethod | str | HTTP 请求方法 |
url | str | 请求路径 |
param | str | 请求参数(截取前2000字符) |
result | str | 响应结果(截取前2000字符) |
ip | str | 客户端 IP 地址 |
location | str | IP 地理位置(ip2region 解析) |
os | str | 操作系统 |
browser | str | 浏览器类型 |
consumeTime | int | 请求耗时(毫秒) |
status | int | 操作状态:0-成功 1-异常 |
error | str | 错误信息 |
createUser | str | 操作人 |
createTime | datetime | 记录时间 |
登录日志通过 record_login_log() 函数记录,自动提取客户端信息:
# application/login_log/services.py
from utils.ip2region import get_ip_location
from utils.common import get_client_ip, parse_user_agent, format_params, format_result
def record_login_log(request, username, log_type, status, source=0,
error_msg=None, consume_time=0, result=None):
"""记录登录日志"""
# 获取客户端 IP
client_ip = get_client_ip(request)
# 获取地理位置信息(ip2region 直接返回字符串)
location_str = get_ip_location(client_ip)
# 解析 User-Agent 信息
user_agent = request.META.get('HTTP_USER_AGENT', '')
ua_info = parse_user_agent(user_agent)
# 构建日志数据
log_data = {
'username': username,
'log_type': log_type,
'source': source,
'method': request.method,
'request_method': request.method,
'url': request.path,
'ip': client_ip,
'location': location_str,
'os': ua_info['os'],
'browser': ua_info['browser'],
'consume_time': consume_time,
'status': status,
'error': error_msg,
'create_user': username,
'update_user': username,
}
LoginLog.objects.create(**log_data)框架集成 ip2region 库,自动将 IP 解析为地理位置:
# utils/ip2region.py
from utils.ip2region import get_ip_location
location = get_ip_location("116.25.146.177")
# 返回: "广东省深圳市"ip2region
ip2region 是离线 IP 地理位置解析库,数据文件存储在 utils/ip2region.xdb,无需网络请求,解析速度极快。支持 IPv4 地址,覆盖国内省市和运营商信息。
自动从 User-Agent 字符串中提取操作系统和浏览器信息:
# utils/common.py
def parse_user_agent(user_agent):
"""解析 User-Agent,返回操作系统和浏览器信息"""
# 示例返回值
return {
'os': 'Windows 10',
'browser': 'Chrome 120.0'
}GET /login/log/page?pageNo=1&pageSize=10&username=admin&type=1&status=0| 参数 | 类型 | 说明 |
|---|---|---|
pageNo | int | 页码(默认 1) |
pageSize | int | 每页条数(默认 10) |
username | str | 登录账号(模糊查询) |
type | int | 日志类型:1-登录 2-退出 |
status | int | 操作状态:0-成功 1-异常 |
startTime | str | 开始时间 |
endTime | str | 结束时间 |
{
"code": 0,
"data": {
"records": [
{
"id": 1,
"title": "用户登录",
"username": "admin",
"logType": 1,
"logTypeText": "登录",
"ip": "127.0.0.1",
"location": "本机地址",
"os": "Windows 10",
"browser": "Chrome 120.0",
"status": 0,
"statusText": "成功",
"createTime": "2026-09-08 10:30:00"
}
],
"total": 100,
"size": 10,
"current": 1,
"pages": 10
},
"msg": "操作成功",
"ok": true
}GET /login/log/detail/<int:log_id>详情接口额外返回 param(请求参数)和 result(响应结果)字段,参数会自动格式化为 JSON 便于前端展示。
DELETE /login/log/delete/<str:log_id>支持批量删除,多个 ID 用逗号分隔:DELETE /login/log/delete/1,2,3
权限要求
sys:loginlog:pagesys:loginlog:detailsys:loginlog:delete| 维度 | 登录日志 | 操作日志 |
|---|---|---|
| 记录内容 | 登录/退出行为 | 业务操作行为 |
| 记录方式 | 登录/退出时手动调用 | @operation_log 装饰器自动记录 |
| 触发时机 | 登录成功/失败、退出登录 | 任何标记了装饰器的视图方法 |
| 数据来源 | application/login_log/ | application/operation_log/ |
| 权限标识 | sys:loginlog:* | sys:operationLog:* |
通过查询登录日志,可识别以下异常场景:
1. 同一账号短时间内多次登录失败 -> 可能是暴力破解
2. 同一 IP 大量不同账号登录 -> 可能是撞库攻击
3. 异地登录(IP 地理位置变化)-> 可能是账号被盗
4. 非工作时间登录 -> 可能是异常行为# 查询最近 1 小时内登录失败的记录
GET /login/log/page?status=1&type=1&startTime=2026-09-08 09:00:00&endTime=2026-09-08 10:00:00
# 查询特定账号的登录记录
GET /login/log/page?username=admin
# 查询特定 IP 的登录记录
GET /login/log/page?ip=192.168.1.100登录日志模块具备以下特点:
1. 自动记录:登录成功/失败/退出自动记录,无需手动埋点
2. IP 解析:ip2region 离线解析,速度快、无网络依赖
3. UA 解析:自动提取浏览器和操作系统信息
4. 地理位置:自动解析 IP 所在地区
5. 安全审计:完整记录登录行为,支持异常登录检测
6. 批量管理:支持按条件筛选、批量删除、清空操作