88import io .kubernetes .client .ApiException ;
99import io .kubernetes .client .models .V1ObjectMeta ;
1010import io .kubernetes .client .models .V1ResourceAttributes ;
11+ import io .kubernetes .client .models .V1SelfSubjectAccessReview ;
12+ import io .kubernetes .client .models .V1SelfSubjectAccessReviewSpec ;
13+ import io .kubernetes .client .models .V1SelfSubjectRulesReview ;
14+ import io .kubernetes .client .models .V1SelfSubjectRulesReviewSpec ;
1115import io .kubernetes .client .models .V1SubjectAccessReview ;
1216import io .kubernetes .client .models .V1SubjectAccessReviewSpec ;
1317import io .kubernetes .client .models .V1SubjectAccessReviewStatus ;
@@ -37,18 +41,50 @@ public enum Operation {
3741 }
3842
3943 public enum Resource {
40- pods ,
41- services ,
42- namespaces ,
43- customresources ,
44- customresourcedefinitions ,
45- domains ,
46- tokenreviews ,
47- networkpolicies ,
48- secrets ,
49- persistentvolumes ,
50- persistentvolumeclaims ,
51- ingresses
44+ CONFIGMAPS ("configmaps" , "" ),
45+ PODS ("pods" , "" ),
46+ LOGS ("pods" , "logs" , "" ),
47+ EXEC ("pods" , "exec" , "" ),
48+ PODTEMPLATES ("podtemplates" , "" ),
49+ EVENTS ("events" , "" ),
50+ SERVICES ("services" , "" ),
51+ NAMESPACES ("namespaces" , "" ),
52+ JOBS ("jobs" , "batch" ),
53+ CRONJOBS ("cronjobs" , "batch" ),
54+ CRDS ("customresourcedefinitions" , "apiextensions.k8s.io" ),
55+ DOMAINS ("domains" , "weblogic.oracle" ),
56+ DOMAINSTATUSS ("domains" , "status" , "weblogic.oracle" ),
57+ SUBJECTACCESSREVIEWS ("subjectaccessreviews" , "authorization.k8s.io" ),
58+ SELFSUBJECTACCESSREVIEWS ("selfsubjectaccessreviews" , "authorization.k8s.io" ),
59+ LOCALSUBJECTACCESSREVIEWS ("localsubjectaccessreviews" , "authorization.k8s.io" ),
60+ SELFSUBJECTRULESREVIEWS ("selfsubjectrulesreviews" , "authorization.k8s.io" ),
61+ TOKENREVIEWS ("tokenreviews" , "authentication.k8s.io" ),
62+ SECRETS ("secrets" , "" ),
63+ PERSISTENTVOLUMES ("persistentvolumes" , "" ),
64+ PERSISTENTVOLUMECLAIMS ("persistentvolumeclaims" , "" ),
65+ STORAGECLASSES ("storageclasses" , "storage.k8s.io" ),
66+ PODPRESETS ("podpresets" , "settings.k8s.io" ),
67+ INGRESSES ("ingresses" , "extensions" ),
68+ NETWORKPOLICIES ("networkpolicies" , "extensions" ),
69+ PODSECURITYPOLICIES ("podsecuritypolicies" , "extensions" );
70+
71+ private final String resource ;
72+ private final String subResource ;
73+ private final String apiGroup ;
74+
75+ Resource (String resource , String apiGroup ) {
76+ this (resource , "" , apiGroup );
77+ }
78+
79+ Resource (String resource , String subResource , String apiGroup ) {
80+ this .resource = resource ;
81+ this .subResource = subResource ;
82+ this .apiGroup = apiGroup ;
83+ }
84+
85+ public String getResource () { return resource ; }
86+ public String getSubResource () { return subResource ; }
87+ public String getAPIGroup () { return apiGroup ; }
5288 }
5389
5490 public enum Scope {
@@ -104,6 +140,24 @@ public boolean check(String principal, final List<String> groups, Operation oper
104140 return result ;
105141 }
106142
143+ public boolean check (Operation operation , Resource resource , String resourceName , Scope scope , String namespaceName ) {
144+ LOGGER .entering ();
145+ V1SelfSubjectAccessReview subjectAccessReview = prepareSelfSubjectAccessReview (operation , resource , resourceName , scope , namespaceName );
146+ try {
147+ CallBuilderFactory factory = ContainerResolver .getInstance ().getContainer ().getSPI (CallBuilderFactory .class );
148+ subjectAccessReview = factory .create ().createSelfSubjectAccessReview (subjectAccessReview );
149+ } catch (ApiException e ) {
150+ LOGGER .severe (MessageKeys .APIEXCEPTION_FROM_SUBJECT_ACCESS_REVIEW , e );
151+ LOGGER .exiting (Boolean .FALSE );
152+ return Boolean .FALSE ;
153+
154+ }
155+ V1SubjectAccessReviewStatus subjectAccessReviewStatus = subjectAccessReview .getStatus ();
156+ Boolean result = subjectAccessReviewStatus .isAllowed ();
157+ LOGGER .exiting (result );
158+ return result ;
159+ }
160+
107161 /**
108162 * Prepares an instance of SubjectAccessReview and returns same.
109163 *
@@ -133,6 +187,21 @@ private V1SubjectAccessReview prepareSubjectAccessReview(String principal, final
133187 return subjectAccessReview ;
134188 }
135189
190+ private V1SelfSubjectAccessReview prepareSelfSubjectAccessReview (Operation operation , Resource resource , String resourceName , Scope scope , String namespaceName ) {
191+ LOGGER .entering ();
192+ V1SelfSubjectAccessReviewSpec subjectAccessReviewSpec = new V1SelfSubjectAccessReviewSpec ();
193+
194+ subjectAccessReviewSpec .setResourceAttributes (prepareResourceAttributes (operation , resource , resourceName , scope , namespaceName ));
195+
196+ V1SelfSubjectAccessReview subjectAccessReview = new V1SelfSubjectAccessReview ();
197+ subjectAccessReview .setApiVersion ("authorization.k8s.io/v1" );
198+ subjectAccessReview .setKind ("SelfSubjectAccessReview" );
199+ subjectAccessReview .setMetadata (new V1ObjectMeta ());
200+ subjectAccessReview .setSpec (subjectAccessReviewSpec );
201+ LOGGER .exiting (subjectAccessReview );
202+ return subjectAccessReview ;
203+ }
204+
136205 /**
137206 * Prepares an instance of ResourceAttributes and returns same.
138207 *
@@ -150,12 +219,9 @@ private V1ResourceAttributes prepareResourceAttributes(Operation operation, Reso
150219 resourceAttributes .setVerb (operation .toString ());
151220 }
152221 if (null != resource ) {
153- resourceAttributes .setResource (resource .toString ());
154- }
155-
156- String apiGroup = getApiGroup (resource );
157- if (apiGroup != null ) {
158- resourceAttributes .setGroup (apiGroup );
222+ resourceAttributes .setResource (resource .resource );
223+ resourceAttributes .setSubresource (resource .subResource );
224+ resourceAttributes .setGroup (resource .apiGroup );
159225 }
160226
161227 if (null != resourceName ) {
@@ -168,25 +234,18 @@ private V1ResourceAttributes prepareResourceAttributes(Operation operation, Reso
168234 LOGGER .exiting (resourceAttributes );
169235 return resourceAttributes ;
170236 }
171-
172- private String getApiGroup (Resource resource ) {
173- if (resource == Resource .domains ) {
174- return "weblogic.oracle" ;
175- }
176-
177- if (resource == Resource .customresourcedefinitions ) {
178- return "apiextensions.k8s.io" ;
179- }
180-
181- if (resource == Resource .tokenreviews ) {
182- return "authentication.k8s.io" ;
183- }
184-
185- if (resource == Resource .ingresses ) {
186- return "extensions" ;
237+
238+ public V1SelfSubjectRulesReview review (String namespace ) {
239+ V1SelfSubjectRulesReview subjectRulesReview = new V1SelfSubjectRulesReview ();
240+ V1SelfSubjectRulesReviewSpec spec = new V1SelfSubjectRulesReviewSpec ();
241+ spec .setNamespace (namespace );
242+ subjectRulesReview .setSpec (spec );
243+ CallBuilderFactory factory = ContainerResolver .getInstance ().getContainer ().getSPI (CallBuilderFactory .class );
244+ try {
245+ return factory .create ().createSelfSubjectRulesReview (subjectRulesReview );
246+ } catch (ApiException e ) {
247+ LOGGER .warning (MessageKeys .EXCEPTION , e );
248+ return null ;
187249 }
188-
189- // TODO - do we need to specify the api group for any of the other Resource values?
190- return null ;
191250 }
192251}
0 commit comments