|
@@ -18,6 +18,9 @@ package org.springframework.security.web.access.expression;
|
|
|
|
|
|
import java.util.function.Supplier;
|
|
|
|
|
|
+import org.springframework.beans.BeansException;
|
|
|
+import org.springframework.context.ApplicationContext;
|
|
|
+import org.springframework.context.ApplicationContextAware;
|
|
|
import org.springframework.expression.EvaluationContext;
|
|
|
import org.springframework.expression.Expression;
|
|
|
import org.springframework.security.access.expression.ExpressionUtils;
|
|
@@ -51,11 +54,20 @@ public final class WebExpressionAuthorizationManager implements AuthorizationMan
|
|
|
this.expression = this.expressionHandler.getExpressionParser().parseExpression(expressionString);
|
|
|
}
|
|
|
|
|
|
+ private WebExpressionAuthorizationManager(String expressionString,
|
|
|
+ SecurityExpressionHandler<RequestAuthorizationContext> expressionHandler) {
|
|
|
+ Assert.hasText(expressionString, "expressionString cannot be empty");
|
|
|
+ this.expressionHandler = expressionHandler;
|
|
|
+ this.expression = expressionHandler.getExpressionParser().parseExpression(expressionString);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Sets the {@link SecurityExpressionHandler} to be used. The default is
|
|
|
* {@link DefaultHttpSecurityExpressionHandler}.
|
|
|
* @param expressionHandler the {@link SecurityExpressionHandler} to use
|
|
|
+ * @deprecated Please use {@link #withDefaults()} or {@link #withExpressionHandler}
|
|
|
*/
|
|
|
+ @Deprecated
|
|
|
public void setExpressionHandler(SecurityExpressionHandler<RequestAuthorizationContext> expressionHandler) {
|
|
|
Assert.notNull(expressionHandler, "expressionHandler cannot be null");
|
|
|
this.expressionHandler = expressionHandler;
|
|
@@ -82,4 +94,78 @@ public final class WebExpressionAuthorizationManager implements AuthorizationMan
|
|
|
return "WebExpressionAuthorizationManager[expression='" + this.expression + "']";
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Use a {@link DefaultHttpSecurityExpressionHandler} to create
|
|
|
+ * {@link WebExpressionAuthorizationManager} instances.
|
|
|
+ *
|
|
|
+ * <p>
|
|
|
+ * Note that publishing the {@link Builder} as a bean will allow the default
|
|
|
+ * expression handler to be configured with a bean provider so that expressions can
|
|
|
+ * reference beans
|
|
|
+ * @return a {@link Builder} for constructing
|
|
|
+ * {@link WebExpressionAuthorizationManager} instances
|
|
|
+ * @since 7.0
|
|
|
+ */
|
|
|
+ public static Builder withDefaults() {
|
|
|
+ return new Builder();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Use this {@link SecurityExpressionHandler} to create
|
|
|
+ * {@link WebExpressionAuthorizationManager} instances
|
|
|
+ * @param expressionHandler
|
|
|
+ * @return a {@link Builder} for constructing
|
|
|
+ * {@link WebExpressionAuthorizationManager} instances
|
|
|
+ * @since 7.0
|
|
|
+ */
|
|
|
+ public static Builder withExpressionHandler(
|
|
|
+ SecurityExpressionHandler<RequestAuthorizationContext> expressionHandler) {
|
|
|
+ return new Builder(expressionHandler);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * A {@link Builder} for constructing {@link WebExpressionAuthorizationManager}
|
|
|
+ * instances.
|
|
|
+ *
|
|
|
+ * <p>
|
|
|
+ * May be reused to create multiple instances.
|
|
|
+ *
|
|
|
+ * @author Josh Cummings
|
|
|
+ * @since 7.0
|
|
|
+ */
|
|
|
+ public static final class Builder implements ApplicationContextAware {
|
|
|
+
|
|
|
+ private final SecurityExpressionHandler<RequestAuthorizationContext> expressionHandler;
|
|
|
+
|
|
|
+ private final boolean defaultExpressionHandler;
|
|
|
+
|
|
|
+ private Builder() {
|
|
|
+ this.expressionHandler = new DefaultHttpSecurityExpressionHandler();
|
|
|
+ this.defaultExpressionHandler = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Builder(SecurityExpressionHandler<RequestAuthorizationContext> expressionHandler) {
|
|
|
+ this.expressionHandler = expressionHandler;
|
|
|
+ this.defaultExpressionHandler = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Create a {@link WebExpressionAuthorizationManager} using this
|
|
|
+ * {@code expression}
|
|
|
+ * @param expression the expression to evaluate
|
|
|
+ * @return the resulting {@link AuthorizationManager}
|
|
|
+ */
|
|
|
+ public WebExpressionAuthorizationManager expression(String expression) {
|
|
|
+ return new WebExpressionAuthorizationManager(expression, this.expressionHandler);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setApplicationContext(ApplicationContext context) throws BeansException {
|
|
|
+ if (this.defaultExpressionHandler) {
|
|
|
+ ((DefaultHttpSecurityExpressionHandler) this.expressionHandler).setApplicationContext(context);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|