2016-09-13 5 views
0

Nach einer Menge Arbeit, die versucht, eine benutzerdefinierte Funktion in Balana zu installieren (für die Anwendung in den Richtlinien), versuche ich hier zu fragen. Im Grunde, was Dokumentation informieren Sie über neue Funktion innerhalb Balana Motor installieren es: 1) wie folgt in Config etwas einfügen:Implementieren einer benutzerdefinierten XACML-Funktion in Balana

<functionFactory name="func" useStandardFunctions="true"> 
    <general> 
     <function class="singlerequestandpolicybalanatester.GpsFunction"/> 
    </general> 
    <!--  <target> 
       <function class="singlerequestandpolicybalanatester.GpsFunction"/> 
      </target> 
      <condition> 
       <function class="singlerequestandpolicybalanatester.GpsFunction"/> 
      </condition> 
    --> 
</functionFactory> 

und offcourse dieser Klasse implementieren

public class GpsFunction extends FunctionBase { 

public static final String NAME_GPS = "coolfunctiongps"; 

public static Set getSupportedIdentifiers() { 

    Set set = new HashSet(); 
    set.add(NAME_GPS); 
    return set; 
} 

public GpsFunction() { 
    super(NAME_GPS, 0, StringAttribute.identifier, false, 3, 3, BooleanAttribute.identifier, false); 
    System.out.println(NAME_GPS); 
} 

@Override 
public EvaluationResult evaluate(List inputs, EvaluationCtx context) { 
blablabla 

Tat überwiegendes getsupportedidentifiers es nicht einmal ist erforderlich, aber was auch immer ..

Jetzt, wenn balana starten Sie sehen, Ihre Klasse initialisiert, Konstruktor heißt es. Dann auch nach Balana es initialisiert ist, können Sie tun:

Set sup = balana.getFunctionGeneralFactory().getSupportedFunctions(); 

    Iterator<String> it = sup.iterator(); 
    System.out.println("General:"); 
    while (it.hasNext()) { 
     String thisfunc = (String) it.next(); 
      System.out.println(thisfunc); 
    } 

und sehen Sie Ihre Funktion geladen und bereit zu gehen. Nett. Kein Fehler. Nach dem Debuggen mit meinem eigenen benutzerdefinierten balana core Build mit vielen Debug-Nachrichten, sehen Sie deutlich, wenn Apply-Element es Laufzeit in einer Richtlinie und die Apply.getInstance (es heißt, und Factory es zusammen mit Ihrem Funktionsnamen, in dieser Fabrik weitergegeben wird . es nicht Ihre Funktion ist, so alles, was Sie es ist eine Ausnahme Laufzeit mit „Unknown FunctionId“ erhalte ich habe versucht sogar die Funktion Fabrik von Hand zu installieren, wie:

FunctionFactoryProxy ff = StandardFunctionFactory.getNewFactoryProxy(); 
    // ff.getGeneralFactory().addFunction(new GpsFunction()); 
    balana.setFunctionGeneralFactory(ff.getGeneralFactory()); 
    balana.setFunctionConditionFactory(ff.getConditionFactory()); 
    balana.setFunctionTargetFactory(ff.getTargetFactory()); 
    balana.getFunctionGeneralFactory().addFunction(new GpsFunction()); 

    PDP pdp = new PDP(balana.getPdpConfig()); 

Wieder kann ich meine Funktion innerhalb dieses Proxy sehen , aber am Ende des Tages, zur Laufzeit, wenn der Motor der

<Rule Effect="Deny" RuleId="itsatrap"> 
    <Target/> 
    <Condition> 
     <Apply FunctionId="coolfunctiongps"> 
      <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only"> 
       <AttributeDesignator AttributeId="attributoid" Category="attributocategory" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true" /> 
      </Apply> 
     </Apply> 
    </Condition> 

</Rule> 

eine Ausnahme beheben, es ist trown, Unknow Functio nId. Also, ich vermisse etwas, und ich frage, wer ein WORKING-Beispiel für eine benutzerdefinierte Funktion im Inneren ausführen und Element anwenden kann. Danke an alle.

Antwort

0

Nach langem Surfen in Balana Quelle, kann ich mich selbst beantworten. Vielleicht wird jemand anderes das hilfreich finden. Vergiss etwas über balana.xml. Sie brauchen das zu handmade, und das ist erstaunlich, ziemlich einfach. (Aber fand das nicht :))

Es besteht aus 4 Schritten.

1) Holen Sie sich einen neuen Factory-Proxy von standardFunctionFactory. So, jetzt haben Sie Proxy mit veränderbaren Standards (ich meine Standardfunktionen) Fabrik.

2) Holen Sie sich allgemeine Fabrik von diesem Proxy (Allgemein, wenn Sie Sichtbarkeit Ihrer Funktion irgendwo oder nur Targetfactory wollen, wenn Sie nur Ziel oder conditionfactory nur in Bedingung Abschnitt von Richtlinien wollen).

3) Fügen Sie Ihre neue Funktion dieser Fabrik

4) TRICKY TEIL abstrahieren FunctionFactory Ausschießen Ihre neue Proxy zur Laufzeit zu verwenden. Dies geschieht, indem Sie static member defaultproxy auf Ihren neuen verweisen.

So lange Geschichte kurz:

FunctionFactoryProxy ff = StandardFunctionFactory.getNewFactoryProxy(); 
FunctionFactory f = ff.getGeneralFactory(); 
f.addFunction(new GpsFunction()); 
FunctionFactory.setDefaultFactory(ff); 

Fertig.

Für den Fall, dass jemand vermisst, wie Sie Ihre eigene neue Funktion erstellen, müssen Sie nur FunctionBase erweitern, Override auswerten, super costructor in Ihrem eigenen Konstruktor aufrufen und public static Set getSupportedIdentifiers() überschreiben.

Tschüss.

Verwandte Themen