2020 */
2121package eu .openanalytics .containerproxy .service ;
2222
23+ import com .google .common .base .Supplier ;
24+ import com .google .common .base .Suppliers ;
2325import eu .openanalytics .containerproxy .auth .IAuthenticationBackend ;
2426import eu .openanalytics .containerproxy .model .spec .AccessControl ;
2527import eu .openanalytics .containerproxy .model .spec .ProxySpec ;
@@ -57,6 +59,26 @@ public boolean checkAccess(Authentication auth, ProxySpec spec, AccessControl ac
5759 }
5860 }
5961
62+ // create context only when necessary (lazy)
63+ Supplier <SpecExpressionContext > context = Suppliers .memoize (() -> {
64+ SpecExpressionContext .SpecExpressionContextBuilder contextBuilder = SpecExpressionContext
65+ .create (objects )
66+ .addServerName ()
67+ .extend (spec );
68+ if (auth != null ) {
69+ contextBuilder .extend (auth , auth .getPrincipal (), auth .getCredentials ());
70+ }
71+ return contextBuilder .build ();
72+ });
73+
74+ if (accessControl .hasStrictExpressionAccess ()) {
75+ // strict expression is always checked
76+ if (!specExpressionResolver .evaluateToBoolean (accessControl .getStrictExpression (), context .get ())) {
77+ // not allowed by strict expression
78+ return false ;
79+ }
80+ }
81+
6082 if (hasNoAccessControl (accessControl )) {
6183 return true ;
6284 }
@@ -69,7 +91,7 @@ public boolean checkAccess(Authentication auth, ProxySpec spec, AccessControl ac
6991 return true ;
7092 }
7193
72- return allowedByExpression (auth , spec , accessControl , objects );
94+ return allowedByExpression (context . get (), accessControl );
7395 }
7496
7597 public boolean hasNoAccessControl (AccessControl accessControl ) {
@@ -108,20 +130,13 @@ public boolean allowedByUsers(Authentication auth, AccessControl accessControl)
108130 return false ;
109131 }
110132
111- public boolean allowedByExpression (Authentication auth , ProxySpec spec , AccessControl accessControl , Object ... objects ) {
133+ public boolean allowedByExpression (SpecExpressionContext context , AccessControl accessControl ) {
112134 if (!accessControl .hasExpressionAccess ()) {
113135 // no expression defined -> this user has no access based on the expression
114136 return false ;
115137 }
116- SpecExpressionContext .SpecExpressionContextBuilder contextBuilder = SpecExpressionContext
117- .create (objects )
118- .addServerName ()
119- .extend (spec );
120138
121- if (auth != null ) {
122- contextBuilder .extend (auth , auth .getPrincipal (), auth .getCredentials ());
123- }
124- return specExpressionResolver .evaluateToBoolean (accessControl .getExpression (), contextBuilder .build ());
139+ return specExpressionResolver .evaluateToBoolean (accessControl .getExpression (), context );
125140 }
126141
127142 public boolean usernameEquals (String authenticatedUser , String other ) {
0 commit comments