Spring Security多IP白名单配置失效,AuthorizationManager无法正常工作
解决Spring Boot Security多IP白名单配置问题
问题根源
你的现有代码仅支持单个IP地址匹配,改为列表形式后未适配多IP匹配逻辑,导致报错。以下是修正后的实现方案:
步骤1:修改配置文件(application.properties)
将IP配置改为逗号分隔形式,支持单个IP或CIDR网段:
allowed.ip.address=192.168.1.100,192.168.2.0/24,10.0.0.0/8
步骤2:更新SecurityConfig代码
修改注入方式为List<String>,并实现多IP匹配逻辑:
import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.authorization.AuthorizationManager; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; import org.springframework.security.web.util.matcher.IpAddressMatcher; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; import java.util.List; @Configuration public class SecurityConfig { // 注入多IP白名单列表 @Value("${allowed.ip.address}") private List<String> allowedIpAddresses; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests .anyRequest().access(hasAnyIpAddress(allowedIpAddresses)) ) .formLogin((form) -> form .loginPage("/login") .permitAll() ) .logout((logout) -> logout.permitAll()); return http.build(); } // 多IP匹配逻辑:只要有一个IP规则匹配就允许访问 private AuthorizationManager<RequestAuthorizationContext> hasAnyIpAddress(List<String> ipAddresses) { return (authentication, context) -> { HttpServletRequest request = context.getRequest(); boolean isAllowed = ipAddresses.stream() .map(IpAddressMatcher::new) .anyMatch(matcher -> matcher.matches(request)); return new AuthorizationDecision(isAllowed); }; } }
关键说明
- IP格式兼容性:
IpAddressMatcher原生支持单个IP(如192.168.1.100)和CIDR网段(如192.168.2.0/24),配置时可混合使用。 - 匹配逻辑:通过
stream().anyMatch()遍历所有IP规则,只要有一个规则匹配当前请求IP,就返回授权通过。 - 注入优化:Spring会自动将逗号分隔的配置字符串转换为
List<String>,无需额外处理字符串分割。
常见错误排查
若配置后仍报错,检查以下几点:
- 配置文件中的IP格式是否正确,避免空格或无效网段写法。
- 确保
SecurityConfig类添加了@Configuration注解(原代码缺失该注解,可能导致配置不生效)。 - 若应用部署在反向代理后,需配置Spring Security获取真实IP,比如添加
server.forward-headers-strategy=native到配置文件。
内容的提问来源于stack exchange,提问作者rokkotnik
相关产品推荐
相关产品推荐

