2 Stimmen

Wie bewerte ich Spring EL in Spring EL

(Entschuldigen Sie bitte, falls dies ein Duplikat ist, aber die Frage ist für Suchmaschinen sehr unfreundlich.)

Ich möchte wissen, wie man Spring EL innerhalb von EL evaluiert (mit allen Funktionen, Variablen, Kontext usw., die übergeben werden).

Konkret möchte ich einen Spring Security-Ausdruck (der nur EL plus einige Funktionen und Kontexte ist) dynamisch auswerten, der aus einer Datenbankeinheit geladen wird, innerhalb eines fest codierten EL in @PreAuthorize.

Also so etwas wie @PreAuthorize("eval(argument.securityExpr)").

2voto

markusw Punkte 1965

Du kannst Springs MethodSecurityExpressionRoot erweitern (und es in deinem eigenen MethodSecurityExpressionHandler erstellen) und eine eval-Methode hinzufügen, die einen String akzeptiert und den SpringExpressionParser den String auswerten lässt. Sollte funktionieren...

Bearbeitung:

Ein bisschen Code:

public class MySpringSecurityRoot extends MethodSecurityExpressionRoot {
  private MyMethodSecurityExpressionHandler handler; // um es im Handler einzufügen

  public boolean eval(String expression) {
    Expression expression = handler.getExpressionParser().parseExpression(expression);
    return ExpressionUtils.evaluateAsBoolean(
       handler.getExpressionParser().parseExpression(expression), 
         handler.createEvaluationContext(authentification, methodInvocation));
  }
}

Dein Handler muss als der Standard-Methodensicherheitsausdruckshandler festgelegt werden:

Jetzt ist deine eval-Funktion in jedem Methodensicherheitsausdruck zugänglich

ABER: Du musst dir darüber im Klaren sein, dass die Person, die deine Sicherheitsregel beschreibt, auf alle Beans im aktuellen Spring-Kontext zugreifen kann! Das könnte ein Sicherheitsrisiko sein.

0voto

NimChimpsky Punkte 44848

Wenn Sie einen einfachen Parameternamen @ verwenden, um Berechtigungen zu überprüfen, können Sie praktisch alles tun, was Sie möchten, ohne den Debug-Modus zu aktivieren.

@PreAuthorize("@mySecurityService.hasPermission(#arg0)")
public String getSpecial(final String special) {
        return "authorisiert";
}

mySecurityService kann ein beliebiges Bean/Methoden sein, das einen boolean-Wert zurückgibt und für arg1 verkabelt ist.

 public class SimpleParameterNameDiscoverer implements ParameterNameDiscoverer {

        public String[] getParameterNames(Method m) {
            return getParameterNames(m.getParameterTypes().length);
        }

        public String[] getParameterNames(Constructor c) {
            return getParameterNames(c.getParameterTypes().length);
        }

        protected String[] getParameterNames(int length) {
            String[] names = new String[length];

            for (int i = 0; i < length; i++)
                names[i] = "arg" + i;

            return names;
        }

    }

Und Kontext :

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X