Ich muss einen dynamischen benutzergenerierten Ausdruck basierend auf einer Bean mithilfe der Spring Expression Language auswerten, möchte jedoch die Felder einschränken, die über eine Annotation verwendet werden können. Wenn ich beispielsweise die folgende Klasse hätte, würde ich gerne den Ausdruck auswerten können field1 + field2
, aber wenn ich versuchen field1 + field3
würde, dies auszuwerten, würde eine Ausnahme generiert.
Ist das möglich? Gibt es eine andere Möglichkeit, den Umfang des Ausdrucks einzuschränken?
public class Foo {
@AllowedField
private int field1;
@AllowedField
private int field2;
private int field3;
}
Grundsätzlich ist dies das, was Sie tun müssen
Erweitern Sie StandardEvaluationContext
, um Ihre eigenen zurückzugeben PropertyAccessor
:
public class SecureEvaluationContext extends StandardEvaluationContext {
@Override
public List<PropertyAccessor> getPropertyAccessors() {
return Arrays.asList(new SecurePropertyAccessor());
}
}
Erweitern ReflectivePropertyAccessor
und implementieren Sie Ihre eigenen canRead
:
public class SecurePropertyAccessor extends ReflectivePropertyAccessor {
@Override
public boolean canRead(EvaluationContext context, Object target, String name) {
boolean canRead = // Add your own logic as needed
return canRead;
}
}
Bewerten mit:
Expression expression = parser.parseExpression("field1 + field2");
EvaluationContext evaluationContext = new SecureEvaluationContext();
Double value = expression.getValue(evaluationContext, new ControlElement(), Double.class);
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen