1

ユーザーのファイル システムにアクセスする必要がある署名済みの Java アプレット (自己署名証明書を使用) があります。私はそれをしなければならないので、「あなたはそれをすべきではない」という返事をしないでください:)

問題は、Firefox 3.0 / Mac からアプレットを実行すると、すべてが希望どおりに機能し、すべてのアクセスが正常に取得されることです。

Safar 4 / Mac を使用すると、アクセスできなくなります。私が特に問題を抱えている行は System.getProperty() です (ただし、それをスタブすると、FS アクセスも機能しません)

String home = System.getProperty("user.home");

私が得る例外は次のとおりです。

java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:628)
at de.samedi.searcher.Searcher.<init>(Searcher.java:49)
at de.samedi.searcher.Applet.getSearcher(Applet.java:193)
at de.samedi.searcher.Applet.getSearcher(Applet.java:187)
at de.samedi.searcher.Applet.addPatient(Applet.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.plugin.javascript.invoke.JSInvoke.invoke(JSInvoke.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.plugin.javascript.JSClassLoader.invoke(JSClassLoader.java:44)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(SecureInvocation.java:658)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(SecureInvocation.java:214)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(SecureInvocation.java:192)
at sun.plugin.liveconnect.SecureInvocation.access$300(SecureInvocation.java:52)
at sun.plugin.liveconnect.SecureInvocation$CallMethodThread.run(SecureInvocation.java:123)

私が言ったように、これは Firefox で完全に動作します。今日はWindowsブラウザをチェックしなきゃ...

何か案は?

4

3 に答える 3

2

jarをコンパイルして署名したら、-verifyオプションを実行して、正しく署名されていることを確認する必要があります。

検証に問題がない場合は、ブラウザにインストールされている証明書を確認してください。私はSafariだけでIEだけで何もしていませんが、少なくともインストールされている証明書を表示できるIEに似た場所があると思います。証明書がインストールされていることを確認します。

また、コードが特権ブロックで実行されていることを確認してください。

 String home = System.getProperty("user.home");

1.4以降では常にエラーがスローされます。すべての権限のjava.policyファイルを編集していない限り

これを署名済みのjarファイルと組み合わせて使用​​してみてください。

 String home = (String) AccessController.doPrivileged(new PrivilegedAction() 
 {
      public Object run() 
      {
     return System.getProperty("user.home");
      }
 });
于 2009-07-31T20:13:31.447 に答える
0

ユーザーは Safari でアプレットへのフル アクセスを許可しましたか? セキュリティマネージャーが動いているようです。

于 2009-07-31T08:49:42.833 に答える
0

古いバージョンの Safari で同様の問題が発生したことを覚えています (これは数年前のことです)。私が見つけた解決策は、アプレットに遅延を追加することでした。ユーザーに「このアプレットを信頼する」ダイアログが表示される前に、何らかの理由で Safari がアプレットの実行を許可していたようです (他のブラウザーは、ユーザーがアクセスを許可または拒否するまでアプレットを起動しません)。その時点でアプレットは信頼されておらず、セキュリティ例外が発生していました。その後、ユーザーは信頼を許可しますが、アプレットがすでに実行されて失敗していたため、手遅れでした。safari に遅延を追加する必要があったため、一定の時間が経過するまで安全なアクセスが必要なことは何も試行せず、アプレットがセキュリティ アクセスを必要とすることを試みる前にユーザーがアクセスできるようにしました。

于 2009-07-31T18:34:07.747 に答える