8
8
import io .kubernetes .client .ApiException ;
9
9
import io .kubernetes .client .models .V1ObjectMeta ;
10
10
import 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 ;
11
15
import io .kubernetes .client .models .V1SubjectAccessReview ;
12
16
import io .kubernetes .client .models .V1SubjectAccessReviewSpec ;
13
17
import io .kubernetes .client .models .V1SubjectAccessReviewStatus ;
@@ -37,18 +41,50 @@ public enum Operation {
37
41
}
38
42
39
43
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 ; }
52
88
}
53
89
54
90
public enum Scope {
@@ -104,6 +140,24 @@ public boolean check(String principal, final List<String> groups, Operation oper
104
140
return result ;
105
141
}
106
142
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
+
107
161
/**
108
162
* Prepares an instance of SubjectAccessReview and returns same.
109
163
*
@@ -133,6 +187,21 @@ private V1SubjectAccessReview prepareSubjectAccessReview(String principal, final
133
187
return subjectAccessReview ;
134
188
}
135
189
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
+
136
205
/**
137
206
* Prepares an instance of ResourceAttributes and returns same.
138
207
*
@@ -150,12 +219,9 @@ private V1ResourceAttributes prepareResourceAttributes(Operation operation, Reso
150
219
resourceAttributes .setVerb (operation .toString ());
151
220
}
152
221
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 );
159
225
}
160
226
161
227
if (null != resourceName ) {
@@ -168,25 +234,18 @@ private V1ResourceAttributes prepareResourceAttributes(Operation operation, Reso
168
234
LOGGER .exiting (resourceAttributes );
169
235
return resourceAttributes ;
170
236
}
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 ;
187
249
}
188
-
189
- // TODO - do we need to specify the api group for any of the other Resource values?
190
- return null ;
191
250
}
192
251
}
0 commit comments