diff --git a/pkg/provider/kubernetes/ingress-nginx/build.go b/pkg/provider/kubernetes/ingress-nginx/build.go index e39e243b9..c319f5cd8 100644 --- a/pkg/provider/kubernetes/ingress-nginx/build.go +++ b/pkg/provider/kubernetes/ingress-nginx/build.go @@ -415,11 +415,13 @@ func (p *Provider) build(ctx context.Context, ingressClasses []*netv1.IngressCla logger.Error(). Err(err). Str("ingress", fmt.Sprintf("%s/%s rule-%d path-%d", ing.Namespace, ing.Name, ri, pi)). - Msg("Cannot resolve auth secret, skipping auth middleware") - } else { - loc.BasicAuth = basic - loc.DigestAuth = digest + Msg("Cannot resolve auth secret, skipping ingress") + // Skipping the ingress entirely when auth secret resolution fails, + // to match ingress-nginx behavior. + continue } + loc.BasicAuth = basic + loc.DigestAuth = digest } // Pre-resolve custom headers ConfigMap. diff --git a/pkg/provider/kubernetes/ingress-nginx/fixtures/ingresses/ingress-with-basicauth-secret-missing.yml b/pkg/provider/kubernetes/ingress-nginx/fixtures/ingresses/ingress-with-basicauth-secret-missing.yml new file mode 100644 index 000000000..2c3f630a0 --- /dev/null +++ b/pkg/provider/kubernetes/ingress-nginx/fixtures/ingresses/ingress-with-basicauth-secret-missing.yml @@ -0,0 +1,25 @@ +--- +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: ingress-with-basicauth-secret-missing + namespace: default + annotations: + nginx.ingress.kubernetes.io/auth-type: "basic" + nginx.ingress.kubernetes.io/auth-secret-type: "auth-file" + nginx.ingress.kubernetes.io/auth-secret: "default/missing-basic-auth" + nginx.ingress.kubernetes.io/auth-realm: "Authentication Required" + +spec: + ingressClassName: nginx + rules: + - host: whoami.localhost + http: + paths: + - path: /basicauth + pathType: Exact + backend: + service: + name: whoami + port: + number: 80 diff --git a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go index 981246150..a594a8406 100644 --- a/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress-nginx/kubernetes_test.go @@ -1329,6 +1329,37 @@ func TestLoadIngresses(t *testing.T) { TLS: &dynamic.TLSConfiguration{}, }, }, + { + desc: "Basic Auth with missing secret — ingress is skipped entirely", + paths: []string{ + "services.yml", + "ingressclasses.yml", + "ingresses/ingress-with-basicauth-secret-missing.yml", + }, + expected: &dynamic.Configuration{ + TCP: &dynamic.TCPConfiguration{ + Routers: map[string]*dynamic.TCPRouter{}, + Services: map[string]*dynamic.TCPService{}, + }, + HTTP: &dynamic.HTTPConfiguration{ + Routers: map[string]*dynamic.Router{}, + Middlewares: map[string]*dynamic.Middleware{}, + Services: map[string]*dynamic.Service{ + "unavailable-service": { + LoadBalancer: &dynamic.ServersLoadBalancer{ + Strategy: "wrr", + PassHostHeader: ptr.To(true), + ResponseForwarding: &dynamic.ResponseForwarding{ + FlushInterval: dynamic.DefaultFlushInterval, + }, + }, + }, + }, + ServersTransports: map[string]*dynamic.ServersTransport{}, + }, + TLS: &dynamic.TLSConfiguration{}, + }, + }, { desc: "Forward Auth", paths: []string{