(ポリシーの適用条件で使用するために) balana 内にカスタム関数をインストールしようとする多くの作業の後、ここで質問しようとしています。基本的に、バラナエンジン内に新しい機能をインストールすることについてドキュメントが教えてくれるものは次のとおりです。1)構成に次のようなものを挿入します:
<functionFactory name="func" useStandardFunctions="true">
<general>
<function class="singlerequestandpolicybalanatester.GpsFunction"/>
</general>
<!-- <target>
<function class="singlerequestandpolicybalanatester.GpsFunction"/>
</target>
<condition>
<function class="singlerequestandpolicybalanatester.GpsFunction"/>
</condition>
-->
</functionFactory>
もちろん、そのクラスを実装します
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 をオーバーライドすることは必須ではありませんが、何でも..
balana を開始すると、クラスが初期化され、コンストラクターが呼び出されます。その後、バラナが初期化された後でも、次のことができます。
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);
}
関数がロードされ、準備ができていることがわかります。良い。いいえ、失敗します。多くのデバッグ メッセージを含む独自のカスタム balana コア ビルドを使用してデバッグした後、Apply 要素が 1 つのポリシーでランタイムを解決し、Apply.getInstance( が呼び出され、ファクトリがそのファクトリで関数名とともに渡されることが明確にわかります。 There is not your function, so all you get it's a exception runtime with "Unknown FunctionId". 次のように、関数ファクトリを手動でインストールしようとさえしました。
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());
繰り返しますが、このプロキシ内で関数を見ることができますが、結局のところ、実行時にエンジンが解決するときに
<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>
例外はありません。不明な FunctionId です。明らかに私は何かを見逃しています。内部でカスタム関数の実用的な例を達成し、要素を適用できる人を尋ねています。みんなありがとう。