Skip to content

Commit 9d18b47

Browse files
committed
Support proxy object in k8s access expression
1 parent ef7cc8a commit 9d18b47

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

src/main/java/eu/openanalytics/containerproxy/backend/kubernetes/KubernetesBackend.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ public Proxy startContainer(Authentication user, Container initialContainer, Con
331331
rContainerBuilder.addRuntimeValue(new RuntimeValue(BackendContainerNameKey.inst, effectiveKubeNamespace + "/" + patchedPod.getMetadata().getName()), false);
332332

333333
// create additional manifests -> use the effective (i.e. patched) namespace if no namespace is provided
334-
createAdditionalManifests(user, proxySpec, proxy, specExtension, effectiveKubeNamespace);
334+
createAdditionalManifests(user, proxySpec, proxy, specExtension, effectiveKubeNamespace, initialContainer);
335335

336336
// tell the status service we are starting the pod/container
337337
proxyStartupLogBuilder.startingContainer(initialContainer.getIndex());
@@ -513,12 +513,12 @@ private JsonPatch readPatchFromSpec(String patchAsString) throws JsonProcessingE
513513
*
514514
* The resource will only be created if it does not already exist.
515515
*/
516-
private void createAdditionalManifests(Authentication auth, ProxySpec proxySpec, Proxy proxy, KubernetesSpecExtension specExtension, String namespace) throws JsonProcessingException {
516+
private void createAdditionalManifests(Authentication auth, ProxySpec proxySpec, Proxy proxy, KubernetesSpecExtension specExtension, String namespace, Container container) throws JsonProcessingException {
517517
for (GenericKubernetesResource fullObject : parseAdditionalManifests(proxy, namespace, specExtension.getKubernetesAdditionalManifests(), false)) {
518518
applyAdditionalManifest(proxy, fullObject);
519519
}
520520
for (AuthorizedAdditionalManifests authorizedAdditionalManifests : specExtension.kubernetesAuthorizedAdditionalManifests) {
521-
if (accessControlEvaluationService.checkAccess(auth, proxySpec, authorizedAdditionalManifests.accessControl)) {
521+
if (accessControlEvaluationService.checkAccess(auth, proxySpec, authorizedAdditionalManifests.accessControl, proxy, container)) {
522522
for (GenericKubernetesResource fullObject : parseAdditionalManifests(proxy, namespace, authorizedAdditionalManifests.manifests, false)) {
523523
applyAdditionalManifest(proxy, fullObject);
524524
}
@@ -528,7 +528,7 @@ private void createAdditionalManifests(Authentication auth, ProxySpec proxySpec,
528528
applyAdditionalManifest(proxy, fullObject);
529529
}
530530
for (AuthorizedAdditionalManifests authorizedAdditionalManifests : specExtension.kubernetesAuthorizedAdditionalPersistentManifests) {
531-
if (accessControlEvaluationService.checkAccess(auth, proxySpec, authorizedAdditionalManifests.accessControl)) {
531+
if (accessControlEvaluationService.checkAccess(auth, proxySpec, authorizedAdditionalManifests.accessControl, proxy, container)) {
532532
for (GenericKubernetesResource fullObject : parseAdditionalManifests(proxy, namespace, authorizedAdditionalManifests.manifests, true)) {
533533
applyAdditionalManifest(proxy, fullObject);
534534
}

src/main/java/eu/openanalytics/containerproxy/service/AccessControlEvaluationService.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import eu.openanalytics.containerproxy.model.spec.ProxySpec;
2626
import eu.openanalytics.containerproxy.spec.expression.SpecExpressionContext;
2727
import eu.openanalytics.containerproxy.spec.expression.SpecExpressionResolver;
28+
import org.apache.commons.lang3.ArrayUtils;
2829
import org.springframework.context.annotation.Lazy;
2930
import org.springframework.security.authentication.AnonymousAuthenticationToken;
3031
import org.springframework.security.core.Authentication;
@@ -44,7 +45,7 @@ public AccessControlEvaluationService(@Lazy IAuthenticationBackend authBackend,
4445
this.specExpressionResolver = specExpressionResolver;
4546
}
4647

47-
public boolean checkAccess(Authentication auth, ProxySpec spec, AccessControl accessControl) {
48+
public boolean checkAccess(Authentication auth, ProxySpec spec, AccessControl accessControl, Object... objects) {
4849
if (auth instanceof AnonymousAuthenticationToken) {
4950
// if anonymous -> only allow access if the backend has no authorization enabled
5051
return !authBackend.hasAuthorization();
@@ -62,7 +63,7 @@ public boolean checkAccess(Authentication auth, ProxySpec spec, AccessControl ac
6263
return true;
6364
}
6465

65-
return allowedByExpression(auth, spec, accessControl);
66+
return allowedByExpression(auth, spec, accessControl, objects);
6667
}
6768

6869
public boolean hasAccessControl(AccessControl accessControl) {
@@ -101,12 +102,13 @@ public boolean allowedByUsers(Authentication auth, AccessControl accessControl)
101102
return false;
102103
}
103104

104-
public boolean allowedByExpression(Authentication auth, ProxySpec spec, AccessControl accessControl) {
105+
public boolean allowedByExpression(Authentication auth, ProxySpec spec, AccessControl accessControl, Object... objects) {
105106
if (!accessControl.hasExpressionAccess()) {
106107
// no expression defined -> this user has no access based on the expression
107108
return false;
108109
}
109-
SpecExpressionContext context = SpecExpressionContext.create(auth, auth.getPrincipal(), auth.getCredentials(), spec);
110+
Object[] args = ArrayUtils.addAll(new Object[]{auth, auth.getPrincipal(), auth.getCredentials(), spec}, objects);
111+
SpecExpressionContext context = SpecExpressionContext.create(args);
110112
return specExpressionResolver.evaluateToBoolean(accessControl.getExpression(), context);
111113
}
112114

0 commit comments

Comments
 (0)