/** * LAN 内网访问配置 * * 在这些 CIDR 范围内访问时,跳过前端认证检查。 * 需要后端配合去掉 API 认证。 */ const ALLOWED_CIDRS = [ '192.168.1.0/24', '192.168.2.0/24', ] // 将 IP 地址转换为 32 位整数 const ipToInt = (ip) => { const parts = ip.split('.').map(Number) return ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0 } // 检查 IP 是否在 CIDR 范围内 const ipInCidr = (ip, cidr) => { const [rangeIp, bits] = cidr.split('/') const mask = ~(2 ** (32 - parseInt(bits)) - 1) >>> 0 return (ipToInt(ip) & mask) === (ipToInt(rangeIp) & mask) } /** * 判断当前访问是否来自允许的内网地址 */ export const isLanAccess = () => { if (typeof window === 'undefined') return false const hostname = window.location.hostname // localhost 始终放行 if (hostname === 'localhost' || hostname === '127.0.0.1') return true // 检查是否在允许的 CIDR 范围内 return ALLOWED_CIDRS.some(cidr => ipInCidr(hostname, cidr)) }