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 ;
1113import io .kubernetes .client .models .V1SubjectAccessReview ;
1214import io .kubernetes .client .models .V1SubjectAccessReviewSpec ;
1315import io .kubernetes .client .models .V1SubjectAccessReviewStatus ;
@@ -37,18 +39,50 @@ public enum Operation {
3739 }
3840
3941 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
42+ CONFIGMAPS ("configmaps" , "" ),
43+ PODS ("pods" , "" ),
44+ LOGS ("pods" , "logs" , "" ),
45+ EXEC ("pods" , "exec" , "" ),
46+ PODTEMPLATES ("podtemplates" , "" ),
47+ EVENTS ("events" , "" ),
48+ SERVICES ("services" , "" ),
49+ NAMESPACES ("namespaces" , "" ),
50+ JOBS ("jobs" , "batch" ),
51+ CRONJOBS ("cronjobs" , "batch" ),
52+ CRDS ("customresourcedefinitions" , "apiextensions.k8s.io" ),
53+ DOMAINS ("domains" , "weblogic.oracle" ),
54+ DOMAINSTATUSS ("domains" , "status" , "weblogic.oracle" ),
55+ SUBJECTACCESSREVIEWS ("subjectaccessreviews" , "authorization.k8s.io" ),
56+ SELFSUBJECTACCESSREVIEWS ("selfsubjectaccessreviews" , "authorization.k8s.io" ),
57+ LOCALSUBJECTACCESSREVIEWS ("localsubjectaccessreviews" , "authorization.k8s.io" ),
58+ SELFSUBJECTRULESREVIEWS ("selfsubjectrulesreviews" , "authorization.k8s.io" ),
59+ TOKENREVIEWS ("tokenreviews" , "authentication.k8s.io" ),
60+ SECRETS ("secrets" , "" ),
61+ PERSISTENTVOLUMES ("persistentvolumes" , "" ),
62+ PERSISTENTVOLUMECLAIMS ("persistentvolumeclaims" , "" ),
63+ STORAGECLASSES ("storageclasses" , "storage.k8s.io" ),
64+ PODPRESETS ("podpresets" , "settings.k8s.io" ),
65+ INGRESSES ("ingresses" , "extensions" ),
66+ NETWORKPOLICIES ("networkpolicies" , "extensions" ),
67+ PODSECURITYPOLICIES ("podsecuritypolicies" , "extensions" );
68+
69+ private final String resource ;
70+ private final String subResource ;
71+ private final String apiGroup ;
72+
73+ Resource (String resource , String apiGroup ) {
74+ this (resource , "" , apiGroup );
75+ }
76+
77+ Resource (String resource , String subResource , String apiGroup ) {
78+ this .resource = resource ;
79+ this .subResource = subResource ;
80+ this .apiGroup = apiGroup ;
81+ }
82+
83+ public String getResource () { return resource ; }
84+ public String getSubResource () { return subResource ; }
85+ public String getAPIGroup () { return apiGroup ; }
5286 }
5387
5488 public enum Scope {
@@ -104,6 +138,24 @@ public boolean check(String principal, final List<String> groups, Operation oper
104138 return result ;
105139 }
106140
141+ public boolean check (Operation operation , Resource resource , String resourceName , Scope scope , String namespaceName ) {
142+ LOGGER .entering ();
143+ V1SelfSubjectAccessReview subjectAccessReview = prepareSelfSubjectAccessReview (operation , resource , resourceName , scope , namespaceName );
144+ try {
145+ CallBuilderFactory factory = ContainerResolver .getInstance ().getContainer ().getSPI (CallBuilderFactory .class );
146+ subjectAccessReview = factory .create ().createSelfSubjectAccessReview (subjectAccessReview );
147+ } catch (ApiException e ) {
148+ LOGGER .severe (MessageKeys .APIEXCEPTION_FROM_SUBJECT_ACCESS_REVIEW , e );
149+ LOGGER .exiting (Boolean .FALSE );
150+ return Boolean .FALSE ;
151+
152+ }
153+ V1SubjectAccessReviewStatus subjectAccessReviewStatus = subjectAccessReview .getStatus ();
154+ Boolean result = subjectAccessReviewStatus .isAllowed ();
155+ LOGGER .exiting (result );
156+ return result ;
157+ }
158+
107159 /**
108160 * Prepares an instance of SubjectAccessReview and returns same.
109161 *
@@ -133,6 +185,21 @@ private V1SubjectAccessReview prepareSubjectAccessReview(String principal, final
133185 return subjectAccessReview ;
134186 }
135187
188+ private V1SelfSubjectAccessReview prepareSelfSubjectAccessReview (Operation operation , Resource resource , String resourceName , Scope scope , String namespaceName ) {
189+ LOGGER .entering ();
190+ V1SelfSubjectAccessReviewSpec subjectAccessReviewSpec = new V1SelfSubjectAccessReviewSpec ();
191+
192+ subjectAccessReviewSpec .setResourceAttributes (prepareResourceAttributes (operation , resource , resourceName , scope , namespaceName ));
193+
194+ V1SelfSubjectAccessReview subjectAccessReview = new V1SelfSubjectAccessReview ();
195+ subjectAccessReview .setApiVersion ("authorization.k8s.io/v1" );
196+ subjectAccessReview .setKind ("SelfSubjectAccessReview" );
197+ subjectAccessReview .setMetadata (new V1ObjectMeta ());
198+ subjectAccessReview .setSpec (subjectAccessReviewSpec );
199+ LOGGER .exiting (subjectAccessReview );
200+ return subjectAccessReview ;
201+ }
202+
136203 /**
137204 * Prepares an instance of ResourceAttributes and returns same.
138205 *
@@ -150,12 +217,9 @@ private V1ResourceAttributes prepareResourceAttributes(Operation operation, Reso
150217 resourceAttributes .setVerb (operation .toString ());
151218 }
152219 if (null != resource ) {
153- resourceAttributes .setResource (resource .toString ());
154- }
155-
156- String apiGroup = getApiGroup (resource );
157- if (apiGroup != null ) {
158- resourceAttributes .setGroup (apiGroup );
220+ resourceAttributes .setResource (resource .resource );
221+ resourceAttributes .setSubresource (resource .subResource );
222+ resourceAttributes .setGroup (resource .apiGroup );
159223 }
160224
161225 if (null != resourceName ) {
@@ -168,25 +232,4 @@ private V1ResourceAttributes prepareResourceAttributes(Operation operation, Reso
168232 LOGGER .exiting (resourceAttributes );
169233 return resourceAttributes ;
170234 }
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" ;
187- }
188-
189- // TODO - do we need to specify the api group for any of the other Resource values?
190- return null ;
191- }
192235}
0 commit comments