feat(api-key): 添加 IP 白名单/黑名单限制功能 (#221)

* feat(api-key): add IP whitelist/blacklist restriction and usage log IP tracking

- Add IP restriction feature for API keys (whitelist/blacklist with CIDR support)
- Add IP address logging to usage logs (admin-only visibility)
- Remove billing_type column from usage logs UI (redundant)
- Use generic "Access denied" error message for security

Backend:
- New ip package with IP/CIDR validation and matching utilities
- Database migrations for ip_whitelist, ip_blacklist (api_keys) and ip_address (usage_logs)
- Middleware IP restriction check after API key validation
- Input validation for IP/CIDR patterns on create/update

Frontend:
- API key form with enable toggle for IP restriction
- Shield icon indicator in table for keys with IP restriction
- Removed billing_type filter and column from usage views

* fix: update API contract tests for ip_whitelist/ip_blacklist fields

Add ip_whitelist and ip_blacklist fields to expected JSON responses
in API contract tests to match the new API key schema.
This commit is contained in:
Edric.Li
2026-01-09 21:59:32 +08:00
committed by GitHub
parent 62dc0b953b
commit 0a4641c24e
45 changed files with 1500 additions and 183 deletions

View File

@@ -279,6 +279,8 @@ export interface ApiKey {
name: string
group_id: number | null
status: 'active' | 'inactive'
ip_whitelist: string[]
ip_blacklist: string[]
created_at: string
updated_at: string
group?: Group
@@ -288,12 +290,16 @@ export interface CreateApiKeyRequest {
name: string
group_id?: number | null
custom_key?: string // Optional custom API Key
ip_whitelist?: string[]
ip_blacklist?: string[]
}
export interface UpdateApiKeyRequest {
name?: string
group_id?: number | null
status?: 'active' | 'inactive'
ip_whitelist?: string[]
ip_blacklist?: string[]
}
export interface CreateGroupRequest {
@@ -560,9 +566,6 @@ export interface UpdateProxyRequest {
export type RedeemCodeType = 'balance' | 'concurrency' | 'subscription'
// 消费类型: 0=钱包余额, 1=订阅套餐
export type BillingType = 0 | 1
export interface UsageLog {
id: number
user_id: number
@@ -589,7 +592,6 @@ export interface UsageLog {
actual_cost: number
rate_multiplier: number
billing_type: BillingType
stream: boolean
duration_ms: number
first_token_ms: number | null
@@ -601,6 +603,9 @@ export interface UsageLog {
// User-Agent
user_agent: string | null
// IP 地址(仅管理员可见)
ip_address: string | null
created_at: string
user?: User
@@ -830,7 +835,6 @@ export interface UsageQueryParams {
group_id?: number
model?: string
stream?: boolean
billing_type?: number
start_date?: string
end_date?: string
}