@@ -18,7 +18,6 @@ package keystone
1818
1919import (
2020 "errors"
21- "strings"
2221
2322 "k8s.io/kubernetes/pkg/api"
2423 "k8s.io/kubernetes/pkg/auth/authorizer"
@@ -97,24 +96,8 @@ func (ka *keystoneAuthorizer) Authorize(a authorizer.Attributes) (string, error)
9796 var (
9897 tenantName string
9998 ns * api.Namespace
99+ err error
100100 )
101- if strings .HasPrefix (a .GetUserName (), "system:serviceaccount:" ) {
102- return "" , nil
103- }
104- if isWhiteListedUser (a .GetUserName ()) {
105- return "" , nil
106- }
107-
108- authConfig := & authConfig {
109- AuthUrl : ka .authUrl ,
110- Username : a .GetUserName (),
111- Password : a .GetPassword (),
112- }
113- osClient , err := newOpenstackClient (authConfig )
114- if err != nil {
115- glog .Errorf ("%v" , err )
116- return "" , err
117- }
118101 if a .GetNamespace () != "" {
119102 ns , err = ka .kubeClient .Namespaces ().Get (a .GetNamespace ())
120103 if err != nil {
@@ -130,6 +113,25 @@ func (ka *keystoneAuthorizer) Authorize(a authorizer.Attributes) (string, error)
130113 tenantName = te .Name
131114 }
132115 }
116+ if authorizer .IsWhiteListedUser (a .GetUserName ()) {
117+ return tenantName , nil
118+ } else {
119+ if ! a .IsReadOnly () && a .GetResource () == "tenants" {
120+ return "" , errors .New ("only admin can write tenant" )
121+ }
122+ }
123+
124+ authConfig := & authConfig {
125+ AuthUrl : ka .authUrl ,
126+ Username : a .GetUserName (),
127+ Password : a .GetPassword (),
128+ }
129+ osClient , err := newOpenstackClient (authConfig )
130+ if err != nil {
131+ glog .Errorf ("%v" , err )
132+ return "" , err
133+ }
134+
133135 tenant , err := osClient .getTenant ()
134136 if err != nil {
135137 glog .Errorf ("%v" , err )
@@ -141,19 +143,6 @@ func (ka *keystoneAuthorizer) Authorize(a authorizer.Attributes) (string, error)
141143 return "" , errors .New ("Keystone authorization failed" )
142144}
143145
144- func isWhiteListedUser (username string ) bool {
145- whiteList := map [string ]bool {
146- api .UserAdmin : true ,
147- "kubelet" : true ,
148- "kube_proxy" : true ,
149- "system:scheduler" : true ,
150- "system:controller_manager" : true ,
151- "system:logging" : true ,
152- "system:monitoring" : true ,
153- }
154- return whiteList [username ]
155- }
156-
157146func (osClient * OpenstackClient ) getTenant () (tenant * tenants.Tenant , err error ) {
158147 tenantList := make ([]tenants.Tenant , 0 )
159148 opts := tenants.ListOpts {}
0 commit comments