如何在Helidon MP中保护/metrics与/health端点的访问?
如何保护Helidon MP的/metrics和/health端点?
当然有办法保护这些端点,下面是两种常用的实现方式:
1. 用户名密码认证保护
你可以借助Helidon的安全扩展,给指定端点添加HTTP Basic认证。
首先确保依赖里包含helidon-microprofile-security,然后在application.yaml里配置安全规则:
security: providers: - http-basic: realm: "helidon-admin" users: - user: "admin" password: "{bcrypt}$2a$10$..." # 生产环境一定要用加密后的密码,比如bcrypt rules: - paths: - "/metrics" - "/health" - "/metrics/*" - "/health/*" roles-allowed: ["admin"]
这样访问这两个端点时,就会弹出登录框,只有认证通过的用户才能访问。
2. IP白名单限制
如果想只允许特定IP访问,你可以自定义一个请求过滤器来实现:
@Provider @Priority(Priorities.AUTHENTICATION) public class IpWhitelistFilter implements ContainerRequestFilter { // 可以从配置文件读取,这里先硬编码示例 private final Set<String> allowedIps = Set.of("127.0.0.1", "192.168.1.0/24"); @Override public void filter(ContainerRequestContext requestContext) throws IOException { String clientIp = requestContext.getHeaderString("X-Forwarded-For"); if (clientIp == null || clientIp.isBlank()) { clientIp = requestContext.getUriInfo().getRequestUri().getHost(); } else { // 处理反向代理后的真实IP,取第一个 clientIp = clientIp.split(",")[0].trim(); } // 检查IP是否在白名单里(网段匹配可以用工具类实现) boolean isAllowed = allowedIps.stream() .anyMatch(ip -> ip.equals(clientIp) || isInSubnet(clientIp, ip)); if (!isAllowed) { requestContext.abortWith(Response.status(Response.Status.FORBIDDEN) .entity("IP地址不允许访问").build()); } } // 简单实现网段匹配,生产环境可以用Apache Commons Net等工具 private boolean isInSubnet(String ip, String subnet) { // 此处省略具体CIDR网段解析匹配逻辑 return false; } }
把这个过滤器注册到应用里,就能拦截非白名单IP的请求。
3. 组合使用
实际场景中可以把两种方式结合起来:先做IP白名单过滤,再验证用户身份,双重保障安全性。
内容的提问来源于stack exchange,提问作者Franck
相关产品推荐
相关产品推荐

