Skip to content

Commit e7e1fb7

Browse files
author
OpenShift Bot
committed
Merge pull request #8824 from deads2k/scoped-acting-as
Merged by openshift-bot
2 parents 6c6a0dc + 640c27e commit e7e1fb7

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

pkg/auth/api/types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ const (
1313
// This is useful when the immutable providerUserName is different than the login used to authenticate
1414
// If present, this extra value is used as the preferred username
1515
IdentityPreferredUsernameKey = "preferred_username"
16+
17+
ImpersonateUserHeader = "Impersonate-User"
18+
ImpersonateUserScopeHeader = "Impersonate-User-Scope"
1619
)
1720

1821
// UserIdentityInfo contains information about an identity. Identities are distinct from users. An authentication server of

pkg/cmd/server/origin/handlers.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"k8s.io/kubernetes/pkg/serviceaccount"
2323
"k8s.io/kubernetes/pkg/util/sets"
2424

25+
authenticationapi "github.com/openshift/origin/pkg/auth/api"
2526
authorizationapi "github.com/openshift/origin/pkg/authorization/api"
2627
"github.com/openshift/origin/pkg/authorization/authorizer"
2728
configapi "github.com/openshift/origin/pkg/cmd/server/api"
@@ -301,7 +302,7 @@ func assetServerRedirect(handler http.Handler, assetPublicURL string) http.Handl
301302

302303
func (c *MasterConfig) impersonationFilter(handler http.Handler) http.Handler {
303304
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
304-
requestedSubject := req.Header.Get("Impersonate-User")
305+
requestedSubject := req.Header.Get(authenticationapi.ImpersonateUserHeader)
305306
if len(requestedSubject) == 0 {
306307
handler.ServeHTTP(w, req)
307308
return
@@ -337,18 +338,25 @@ func (c *MasterConfig) impersonationFilter(handler http.Handler) http.Handler {
337338
return
338339
}
339340

341+
var extra map[string][]string
342+
if requestScopes, ok := req.Header[authenticationapi.ImpersonateUserScopeHeader]; ok {
343+
extra = map[string][]string{authorizationapi.ScopesKey: requestScopes}
344+
}
345+
340346
switch resource {
341347
case kapi.Resource(authorizationapi.ServiceAccountResource):
342348
newUser := &user.DefaultInfo{
343349
Name: serviceaccount.MakeUsername(namespace, name),
344350
Groups: serviceaccount.MakeGroupNames(namespace, name),
351+
Extra: extra,
345352
}
346353
newUser.Groups = append(newUser.Groups, bootstrappolicy.AuthenticatedGroup)
347354
c.RequestContextMapper.Update(req, kapi.WithUser(ctx, newUser))
348355

349356
case userapi.Resource(authorizationapi.UserResource):
350357
newUser := &user.DefaultInfo{
351-
Name: name,
358+
Name: name,
359+
Extra: extra,
352360
}
353361
groups, err := c.GroupCache.GroupsFor(name)
354362
if err == nil {
@@ -362,7 +370,8 @@ func (c *MasterConfig) impersonationFilter(handler http.Handler) http.Handler {
362370

363371
case userapi.Resource(authorizationapi.SystemUserResource):
364372
newUser := &user.DefaultInfo{
365-
Name: name,
373+
Name: name,
374+
Extra: extra,
366375
}
367376

368377
if name == bootstrappolicy.UnauthenticatedUsername {

pkg/cmd/server/origin/handlers_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"k8s.io/kubernetes/pkg/util/sets"
1616
"k8s.io/kubernetes/pkg/watch"
1717

18+
authenticationapi "github.com/openshift/origin/pkg/auth/api"
1819
"github.com/openshift/origin/pkg/authorization/authorizer"
1920
configapi "github.com/openshift/origin/pkg/cmd/server/api"
2021
userapi "github.com/openshift/origin/pkg/user/api"
@@ -222,7 +223,7 @@ func TestImpersonationFilter(t *testing.T) {
222223
t.Errorf("%s: unexpected error: %v", tc.name, err)
223224
continue
224225
}
225-
req.Header.Add("Impersonate-User", tc.impersonationString)
226+
req.Header.Add(authenticationapi.ImpersonateUserHeader, tc.impersonationString)
226227
resp, err := http.DefaultClient.Do(req)
227228
if err != nil {
228229
t.Errorf("%s: unexpected error: %v", tc.name, err)

test/integration/scopes_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ import (
99
kapierrors "k8s.io/kubernetes/pkg/api/errors"
1010
"k8s.io/kubernetes/pkg/serviceaccount"
1111

12+
authenticationapi "github.com/openshift/origin/pkg/auth/api"
1213
"github.com/openshift/origin/pkg/authorization/authorizer/scope"
14+
buildapi "github.com/openshift/origin/pkg/build/api"
1315
"github.com/openshift/origin/pkg/client"
1416
"github.com/openshift/origin/pkg/cmd/util/clientcmd"
1517
oauthapi "github.com/openshift/origin/pkg/oauth/api"
18+
userapi "github.com/openshift/origin/pkg/user/api"
1619
testutil "github.com/openshift/origin/test/util"
1720
testserver "github.com/openshift/origin/test/util/server"
1821
)
@@ -92,3 +95,47 @@ func TestScopedTokens(t *testing.T) {
9295
t.Fatalf("missing error: %v got user %#v", err, impersonatedUser)
9396
}
9497
}
98+
99+
func TestScopedImpersonation(t *testing.T) {
100+
testutil.RequireEtcd(t)
101+
_, clusterAdminKubeConfig, err := testserver.StartTestMasterAPI()
102+
if err != nil {
103+
t.Fatalf("unexpected error: %v", err)
104+
}
105+
106+
clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
107+
if err != nil {
108+
t.Fatalf("unexpected error: %v", err)
109+
}
110+
111+
clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
112+
if err != nil {
113+
t.Fatalf("unexpected error: %v", err)
114+
}
115+
116+
projectName := "hammer-project"
117+
userName := "harold"
118+
if _, err := testserver.CreateNewProject(clusterAdminClient, *clusterAdminClientConfig, projectName, userName); err != nil {
119+
t.Fatalf("unexpected error: %v", err)
120+
}
121+
122+
err = clusterAdminClient.Get().
123+
SetHeader(authenticationapi.ImpersonateUserHeader, "harold").
124+
SetHeader(authenticationapi.ImpersonateUserScopeHeader, "user:info").
125+
Namespace(projectName).Resource("builds").Name("name").Do().Into(&buildapi.Build{})
126+
if !kapierrors.IsForbidden(err) {
127+
t.Fatalf("unexpected error: %v", err)
128+
}
129+
130+
user := &userapi.User{}
131+
err = clusterAdminClient.Get().
132+
SetHeader(authenticationapi.ImpersonateUserHeader, "harold").
133+
SetHeader(authenticationapi.ImpersonateUserScopeHeader, "user:info").
134+
Resource("users").Name("~").Do().Into(user)
135+
if err != nil {
136+
t.Fatalf("unexpected error: %v", err)
137+
}
138+
if user.Name != "harold" {
139+
t.Fatalf("expected %v, got %v", "harold", user.Name)
140+
}
141+
}

0 commit comments

Comments
 (0)