署名済みアプレット + XSL 変換に関するヘルプが必要です
入力 XML、XSL、および出力がローカル ファイル システムで読み取り/書き込みされる XSL 変換を実行する署名付きアプレット (1 つの JAR ファイルを含む) があります。私はすでにJREでそれを試しました
- 1.5.0_22
- 1.6.0_29
- 1.7.0_01
結果は同じです。
XSL ファイルに外部 XML ドキュメントへの参照が含まれている場合:
<xsl:variable name="extXML" select="document('/tmp/A.XML')"/>
<xsl:value-of select="$extXML/Child"/>
変換は失敗します:
com.sun.org.apache.xalan.internal.xsltc.TransletException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/A.XML read)
at com.sun.org.apache.xalan.internal.xsltc.dom.LoadDocument.documentF(LoadDocument.java:142)
at in.topLevel()
at in.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:603)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:709)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at myxsltapplet.MyXSLTApplet.xsltTransform(MyXSLTApplet.java:66)
この外部 XML ドキュメントへの参照がコメント アウトされている場合、すべて正常に機能します。ポリシー ファイルを使用するとこの問題は解決しますが、残念ながらこれはオプションではありません。
TransformerFactoryに設定したURIResolverを実装しましたが、AccessControlException も取得します。
アプレットで、SecurityManagerとそのAccessControlContextを取得し、ハッシュコードをログアウトしました。
SecurityManager: sun.plugin2.applet.Applet2SecurityManager@103fcaa
getSecurityContext(): java.security.AccessControlContext@17b2b2
URIResolver 実装で同じことを行い、AccessControlContext が変更されました。
SecurityManager: sun.plugin2.applet.Applet2SecurityManager@103fcaa
getSecurityContext(): java.security.AccessControlContext@ede64c
元の AccessControlContext で checkPermission を呼び出すと、例外なく実行されます。
URIResolver でアクセス可能な新しい AccessControlContext で checkPermission を呼び出す:
AccessControlContext acc = (AccessControlContext) System.getSecurityManager().getSecurityContext();
acc.checkPermission(new FilePermission("/tmp/A.XML", "read"));
スロー:
ERROR: 'java.security.AccessControlException: access denied (java.io.FilePermission /tmp/A.XML read)'
それは正常なことですか、それともバグですか?アイデアをありがとう、