Become a sponsor

登录日志
登录日志记录每次登录尝试(成功/失败),包含登录账号、IP地址、浏览器信息、登录时间等。支持 IP 地理位置解析(ip2region)和 User-Agent 解析。登录逻辑位于 src/modules/auth/service.py,日志记录位于 src/modules/login_log/service.py。
登录日志在以下时机自动记录:
1. 登录成功 → 记录成功日志(status=0)
2. 登录失败(密码错误)→ 记录失败日志(status=1)
3. 登录失败(用户不存在)→ 记录失败日志(status=1)
4. 登录失败(账户被锁定)→ 记录失败日志(status=1)| 字段 | 说明 |
|---|---|
username | 登录账号 |
ip | 客户端 IP 地址 |
ip_location | IP 地理位置(ip2region 解析) |
browser | 浏览器类型 |
os | 操作系统 |
status | 登录状态:0-成功 1-失败 |
message | 提示信息 |
login_time | 登录时间 |
框架集成 ip2region 库,自动将 IP 解析为地理位置:
# src/utils/ip2region.py
from utils.ip2region import get_ip_location
location = get_ip_location("116.25.146.177")
# 返回: "广东省深圳市"ip2region
ip2region 是离线 IP 地理位置解析库,数据文件存储在 static/ip2region.xdb,无需网络请求,解析速度极快。
框架解析请求头中的 User-Agent,提取浏览器和操作系统信息:
# src/utils/ua.py
from utils.ua import parse_ua
ua_info = parse_ua(user_agent_string)
# 返回: {"browser": "Chrome 120", "os": "Windows 10"}GET /api/v1/login/log/list?pageNo=1&pageSize=10
GET /api/v1/login/log/detail/{id}登录日志配合登录失败锁定机制,防止暴力破解。锁定逻辑按 IP+用户名 维度:
# src/modules/auth/service.py
_LOGIN_FAIL_PREFIX = 'login:fail:'
_LOGIN_LOCK_PREFIX = 'login:lock:'
def _fail_key(ip: str, username: str) -> str:
"""登录失败计数Key:按IP+用户名维度"""
return f'{_LOGIN_FAIL_PREFIX}{ip}:{username}'
def _lock_key(ip: str, username: str) -> str:
"""登录锁定Key"""
return f'{_LOGIN_LOCK_PREFIX}{ip}:{username}'
async def _is_locked(redis, ip: str, username: str) -> tuple[bool, int]:
"""检查是否处于锁定状态,返回 (是否锁定, 剩余秒数)"""
key = _lock_key(ip, username)
ttl = await redis.ttl(key)
if ttl and ttl > 0:
return True, ttl
return False, 0
async def _record_fail(redis, ip: str, username: str):
"""记录一次登录失败,达到上限则锁定"""
key = _fail_key(ip, username)
# 原子 incr + 首次设置过期(Lua 脚本,防止崩溃窗口内 key 永久残留)
count = await incr_with_expire(redis, key, LOGIN_LOCK_SECONDS)
if count >= LOGIN_FAIL_MAX:
lock_k = _lock_key(ip, username)
await redis.set(lock_k, '1', ex=LOGIN_LOCK_SECONDS)
async def _clear_fail(redis, ip: str, username: str):
"""登录成功后清除失败记录"""
fail_k = _fail_key(ip, username)
lock_k = _lock_key(ip, username)
await redis.delete(fail_k, lock_k)配置项:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
LOGIN_FAIL_MAX | 5 | 登录失败次数上限 |
LOGIN_LOCK_SECONDS | 300 | 锁定时间(秒) |
登录日志模块具备以下特点:
1. 自动记录:登录成功/失败自动记录,无需手动埋点
2. IP 解析:ip2region 离线解析,速度快、无网络依赖
3. UA 解析:自动提取浏览器和操作系统信息
4. 防暴力破解:失败计数 + 账户锁定(IP+用户名维度)
5. 安全审计:完整记录登录行为,便于安全审计