@@ -26,6 +26,7 @@ import (
2626 "github.com/stretchr/testify/require"
2727 "github.com/xrstf/mockoidc"
2828
29+ authenticationv1 "k8s.io/api/authentication/v1"
2930 rbacv1 "k8s.io/api/rbac/v1"
3031 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3132 "k8s.io/apimachinery/pkg/util/wait"
@@ -239,6 +240,72 @@ func TestWorkspaceOIDC(t *testing.T) {
239240 }
240241}
241242
243+ func TestUserScope (t * testing.T ) {
244+ framework .Suite (t , "control-plane" )
245+
246+ ctx := context .Background ()
247+
248+ // start kcp and setup clients
249+ server := kcptesting .SharedKcpServer (t )
250+
251+ baseWsPath , _ := kcptesting .NewWorkspaceFixture (t , server , logicalcluster .NewPath ("root" ), kcptesting .WithNamePrefix ("oidc-scope" ))
252+
253+ kcpConfig := server .BaseConfig (t )
254+ kubeClusterClient , err := kcpkubernetesclientset .NewForConfig (kcpConfig )
255+ require .NoError (t , err )
256+ kcpClusterClient , err := kcpclientset .NewForConfig (kcpConfig )
257+ require .NoError (t , err )
258+
259+ mock , ca := startMockOIDC (t , server )
260+ authConfig := createWorkspaceAuthentication (t , ctx , kcpClusterClient , baseWsPath , mock , ca )
261+ wsType := createWorkspaceType (t , ctx , kcpClusterClient , baseWsPath , authConfig )
262+
263+ // create a new workspace with our new type
264+ t .Log ("Creating Workspaces..." )
265+ teamPath , teamWs := kcptesting .NewWorkspaceFixture (t , server , baseWsPath , kcptesting .WithName ("team-a" ), kcptesting .WithType (baseWsPath , tenancyv1alpha1 .WorkspaceTypeName (wsType )))
266+
267+ var (
268+ userName = "peter"
269+ 270+ userGroups = []string {"developers" , "admins" }
271+ expectedGroups = []string {}
272+ )
273+
274+ for _ , group := range userGroups {
275+ expectedGroups = append (expectedGroups , "oidc:" + group )
276+ }
277+
278+ grantWorkspaceAccess (t , ctx , kubeClusterClient , teamPath , []rbacv1.Subject {{
279+ Kind : "User" ,
280+ Name : "oidc:" + userEmail ,
281+ }})
282+
283+ token := createOIDCToken (t , mock , userName , userEmail , userGroups )
284+
285+ peterClient , err := kcpkubernetesclientset .NewForConfig (framework .ConfigWithToken (token , kcpConfig ))
286+ require .NoError (t , err )
287+
288+ t .Logf ("Creating SelfSubjectAccessReview in %s" , teamPath )
289+
290+ var review * authenticationv1.SelfSubjectReview
291+ require .Eventually (t , func () bool {
292+ request := & authenticationv1.SelfSubjectReview {}
293+
294+ var err error
295+ review , err = peterClient .Cluster (teamPath ).AuthenticationV1 ().SelfSubjectReviews ().Create (ctx , request , metav1.CreateOptions {})
296+ if err != nil {
297+ t .Log (err )
298+ }
299+
300+ return err == nil
301+ }, wait .ForeverTestTimeout , 500 * time .Millisecond )
302+
303+ user := review .Status .UserInfo
304+ require .Equal (t , "oidc:" + userEmail , user .Username )
305+ require .Subset (t , user .Groups , expectedGroups )
306+ require .Equal (t , user .Extra ["authentication.kcp.io/scopes" ], authenticationv1.ExtraValue {"cluster:" + teamWs .Spec .Cluster })
307+ }
308+
242309func createWorkspaceAuthentication (t * testing.T , ctx context.Context , client kcpclientset.ClusterInterface , workspace logicalcluster.Path , mock * mockoidc.MockOIDC , ca * crypto.CA ) string {
243310 name := fmt .Sprintf ("mockoidc-%d" , rand .Int ())
244311
0 commit comments