IpAddressAuthorizationManager 类用于基于 IP 地址进行访问控制的授权管理器。它允许开发者根据客户端的 IP 地址或 IP 网段(CIDR 格式)来限制或允许请求。
CIDR(Classless Inter-Domain Routing,无类域间路由) 是一种用于分配和管理 IP 地址的网络编址技术,诞生于 1993 年,旨在解决 IPv4 地址枯竭和路由表膨胀问题。它摒弃了传统的 A、B、C 类网络划分方式,采用更灵活的地址块分配规则,核心是通过 网络前缀长度 标识网络范围。
CIDR 格式通常以“IP地址/前缀长度”的形式表示,例如:
192.168.1.0/24:表示一个网络,其中 /24 表示前 24 位为网络地址,后 8 位为主机地址。
10.0.0.0/8:前 8 位为网络地址,后 24 位为主机地址,覆盖 10.0.0.0 到 10.255.255.255 的所有 IP 地址。
CIDR 格式的关键要素解析:
(1)前缀长度(/n):用数字 n 表示 IP 地址中属于网络地址的位数(范围:0 ≤ n ≤ 32)。例如,/24 对应传统 C 类网络的默认子网掩码 255.255.255.0(二进制中前 24 位为 1)。
(2)与子网掩码的转换:CIDR 前缀长度可直接转换为子网掩码,规则如下:
前缀长度 n 表示子网掩码中前 n 位为 1,剩余 32-n 位为 0。示例:
CIDR 前缀 | 二进制子网掩码 | 点分十进制子网掩码 |
/8 | 11111111.00000000.00000000.00000000 | 255.0.0.0 |
/16 | 11111111.11111111.00000000.00000000 | 255.255.0.0 |
/24 | 11111111.11111111.11111111.00000000 | 255.255.255.0 |
示例:CIDR 地址块计算,以 172.16.0.0/16 为例:
网络地址:172.16.0.0(前 16 位固定)。
子网掩码:255.255.0.0
可用主机地址范围:172.16.0.1 到 172.16.255.254(共 2^(32-16) - 2 = 65534 个地址)。
广播地址:172.16.255.255(主机位全为 1)。
该管理器通过检查请求的客户端 IP 地址是否匹配预定义的模式来做出授权决策。当请求到达时,它会提取客户端的 IP 地址(通常是 HttpServletRequest.getRemoteAddr()),然后与配置的 IP 模式进行比较。
以下是 IpAddressAuthorizationManager 的最常见用法:
http..authorizeHttpRequests(authorize -> authorize // 需要具有 admin 角色权限才能访问 /sys 路径的请求 .requestMatchers("/sys/**").access(AuthorizationManagers.anyOf( IpAddressAuthorizationManager.hasIpAddress("192.168.1.15"), IpAddressAuthorizationManager.hasIpAddress("192.168.1.0/24") )) .anyRequest().authenticated() // 其他请求需认证 )
笔者本机 IP 地址如下图:
如果使用 http://localhost:8080 访问将被拒,如果使用 http://192.168.1.15:8080 访问,一切正常。