Skip to content

Commit 766dcb1

Browse files
committed
feat(identity): register status.userUID field selector
Register AddFieldLabelConversionFunc for UserIdentity and Session resources to enable status.userUID field selector, following the same pattern as Activity API. This allows staff users to query other users' identities and sessions using fieldSelector=status.userUID=<user-id>. The field selector validation happens at the API server level, and authorization is enforced by the backend (auth-provider-zitadel) which checks if the user is in the staff-users group. Removed the HTTP filter approach in favor of proper scheme registration.
1 parent 93d5de8 commit 766dcb1

3 files changed

Lines changed: 55 additions & 68 deletions

File tree

cmd/milo/apiserver/config.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,6 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *server.Config, loopbac
403403
handler = datumfilters.UserContactGroupMembershipListConstraintDecorator(handler)
404404
handler = datumfilters.UserContactGroupMembershipRemovalListConstraintDecorator(handler)
405405
handler = datumfilters.ContactGroupVisibilityWithoutPrivateDecorator(handler)
406-
handler = datumfilters.IdentityFieldSelectorPassthrough(handler)
407406
handler = genericapifilters.WithRequestInfo(handler, c.RequestInfoResolver)
408407
handler = genericapifilters.WithRequestReceivedTimestamp(handler)
409408
// handler = genericapifilters.WithMuxAndDiscoveryComplete(handler, c.lifecycleSignals.MuxAndDiscoveryComplete.Signaled())

pkg/apis/identity/v1alpha1/register.go

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package v1alpha1
22

33
import (
4+
"fmt"
5+
46
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
57
"k8s.io/apimachinery/pkg/runtime"
68
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -36,11 +38,59 @@ func addKnownTypes(scheme *runtime.Scheme) error {
3638
)
3739
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
3840

39-
// NOTE: We do NOT register field label conversion functions for UserIdentity and Session.
40-
// These are virtual/proxy resources (not CRDs) that delegate to an external backend.
41-
// Field selector validation is handled by the backend (auth-provider-zitadel), not by
42-
// the Milo API server. Registering conversion functions here would cause the API server
43-
// to validate field selectors and reject unknown ones before they reach the backend.
41+
// Register field label conversions for UserIdentity
42+
// This enables field selectors like status.userUID=<user-id> for staff users
43+
userIdentityGVK := SchemeGroupVersion.WithKind("UserIdentity")
44+
if err := scheme.AddFieldLabelConversionFunc(userIdentityGVK,
45+
UserIdentityFieldLabelConversionFunc); err != nil {
46+
return err
47+
}
48+
49+
// Register field label conversions for Session
50+
// This enables field selectors like status.userUID=<user-id> for staff users
51+
sessionGVK := SchemeGroupVersion.WithKind("Session")
52+
if err := scheme.AddFieldLabelConversionFunc(sessionGVK,
53+
SessionFieldLabelConversionFunc); err != nil {
54+
return err
55+
}
4456

4557
return nil
4658
}
59+
60+
// UserIdentityFieldLabelConversionFunc converts field selectors for UserIdentity resources.
61+
// This allows staff users to filter user identities by fields beyond the default metadata.name.
62+
func UserIdentityFieldLabelConversionFunc(label, value string) (string, string, error) {
63+
switch label {
64+
// Metadata fields (default Kubernetes fields)
65+
case "metadata.name",
66+
"metadata.namespace":
67+
return label, value, nil
68+
69+
// Status fields (custom field selector for staff users)
70+
case "status.userUID":
71+
return label, value, nil
72+
73+
default:
74+
return "", "", fmt.Errorf("%q is not a known field selector: only %q are supported",
75+
label, []string{"metadata.name", "metadata.namespace", "status.userUID"})
76+
}
77+
}
78+
79+
// SessionFieldLabelConversionFunc converts field selectors for Session resources.
80+
// This allows staff users to filter sessions by fields beyond the default metadata.name.
81+
func SessionFieldLabelConversionFunc(label, value string) (string, string, error) {
82+
switch label {
83+
// Metadata fields (default Kubernetes fields)
84+
case "metadata.name",
85+
"metadata.namespace":
86+
return label, value, nil
87+
88+
// Status fields (custom field selector for staff users)
89+
case "status.userUID":
90+
return label, value, nil
91+
92+
default:
93+
return "", "", fmt.Errorf("%q is not a known field selector: only %q are supported",
94+
label, []string{"metadata.name", "metadata.namespace", "status.userUID"})
95+
}
96+
}

pkg/server/filters/identity_field_selector.go

Lines changed: 0 additions & 62 deletions
This file was deleted.

0 commit comments

Comments
 (0)