2016-09-13 2 views
0

バラナの中にカスタム関数をインストールしようとすると(ポリシーの適用条件で使用するため)、私はここで質問しようとしています。 は基本的に、約balanaエンジン内部の新機能をインストール言うことドキュメンテーションそれはです: 1)このような設定に何かに挿入します。バラナでカスタムXACML関数を実装する

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

とoffcourseそれもありません

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 

実際オーバーライドgetsupportedidentifiersそのクラスを実装しかし、何でも。

バラナが始まると、あなたのクラスが初期化されていることがわかります。それはコンストラクタです。

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); 
    } 

を、あなたの関数がロードされ、行く準備ができてSEE:それは初期化されていてもbalana後に続いて、あなたが行うことができます。ニース。いいえ、失敗します。多くのデバッグメッセージを使用して独自のカスタムbalanaコアビルドを使用してデバッグした後、1つのポリシーでRuntimeを解決したらApply要素を確認し、Apply.getInstance(呼び出され、ファクトリで関数名とともに渡されるファクトリ

再び
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()); 

私はこのプロキシの内側に私の関数を参照してくださいすることができます。あなたの関数は次のように私も、手によって機能の工場をインストールするためにしようと試みますが、それは「不明FunctionId」との例外ランタイムのgetすべてがそう、そこではありませんしかし、実行時に、一日の終わりで、エンジンが

<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> 

にそれがtrown、Unknow Functioだ例外を解決するときnId。だから明らかに私は何かが恋しいです。私は内部でカスタム関数のWORKINGの例を達成し、要素を適用できるかどうかを尋ねています。みんなありがとう。

答えて

0

バラナソースで長時間サーフィンした後、私は自分自身に答えることができます。多分誰かがこれが役に立つと思うかもしれません。 balana.xmlについては何も忘れてしまいます。あなたはこれを手作りする必要があり、これはかなり簡単です。 (しかし、これを見つけられませんでした)

これは4つのステップで構成されています。

1)standardFunctionFactoryから新しいファクトリプロキシを取得します。だから、あなたは変更可能な標準(私は標準的な機能を意味します)工場でプロキシを持っています。

2)そのプロキシから汎用ファクトリを取得します(一般的には、あなたがどこでも機能するようにするには一般的です。ポリシーの条件セクションにのみターゲットまたは条件が必要な場合はTargetfactoryのみ)。

3)は、その工場

4)が実行時に新しいプロキシを使用する抽象FunctionFactoryに課すトリッキーな部分に新しい機能を追加します。これは、静的メンバーdefaultproxyを新しいメンバーに指定することによって行われます。

だから、長い話を短く:

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

完了。

あなた自身の新しい関数を作成する方法が見つからない場合は、FunctionBaseをオーバーライドして評価をオーバーライドし、独自のコンストラクタ内でスーパーコストコンストラクタを呼び出し、public static Set getSupportedIdentifiers()をオーバーライドする必要があります。

Bye。

関連する問題