2


1

イントラネットアプレット用に設定されたAllPermissionを取得できません。 誰も手伝ってくれる?

多くの読み取りとテストを行った後、codeBase付与オプションを使用してイントラネットアプレットにすべてのアクセス許可を与えることができませんでした。 このアプレットには、OCRリーダー(HDDにもイメージファイルを書き込む)およびその他の外部デバイス用のドライバーライブラリにアクセスする必要があるため、完全なアクセス許可が必要です。

java.policyファイルを構成し、次を追加しました。

`コードベース" http:// myIntranetServer /-"を許可する{permission java.security.AllPermission; }; `

コンソールでポリシーファイルをリロードし、ブラウザを再起動しても、デフォルトでは許可されていない「user.name」システムプロパティの読み取りなど、多くの操作でjava.security.AccessControlException:accessが拒否されます。

デバッグについては、デフォルトでallパーミッションを付与することも試みましたが、動作するため、私の問題は基本的にde codeBaseオプションに関連しています。 JRE1.6-u17でWindows 7およびLinuxクライアントを実行していますが、どちらも同じ動作をします。

誰も手伝ってくれる?

前もって感謝します、

マデイラ

2 Answer


4


最後のコメントを正しく理解したかどうかはわかりません。 あなたが2つ(私にとって)異なることを述べているように:

  • plugin.jarを使用します(つまり、javaはjavascriptを呼び出します 関数)

  • 私はJavascript_から同じ関数を呼び出します」(つまり私にとっては あなたのjavascriptはjava関数を呼び出します)

後者の方が正しい解釈だと思います。

セキュリティ関連の処理を一切行わないJavaメソッドを(liveconnect経由で)呼び出すだけで十分です。 また、javascriptコードで直接「myapplet.safeMethod();」を使用して(「id = "myapplet"」を使用してアプレットを実行できます)。

アプレットに対して通常制限されているjavascriptからのjavaメソッドの呼び出しに関する主な問題は、呼び出しがJVMとアプレット自体の異なるコンテキストで実行されるように見えることです。 したがって、非特権コードとして扱われ、「AccessControlException」が発生します。 たとえば 私の他の答えのように、アプレット自体によって実行され、適切な権限を取得して実行されるメソッド。

ここで、http://java.sun.com/javase/6/webnotes/6u10/plugin2/liveconnect [新しいJava™プラグインテクノロジーでのLiveConnectサポート]セクションhttp://java.sun.comを読むと、 /javase/6/webnotes/6u10/plugin2/liveconnect/#SECURITY_MODEL[2.8 JavaScriptからJavaへの呼び出しのセキュリティモデル] SUN状態

_ JavaScriptからJavaへの呼び出しが行われると、JavaScriptコードは、コードベースがドキュメントベース(つまり、ドキュメントを含むディレクトリのURL)である信頼できないアプレットから来ているかのようにモデル化されます。 _

アプレットとjavascriptが同じサイトから来ている場合、javascript-to-java呼び出しはアプレット自体と同じ権限で実行する必要があります。 私たちの場合、これは「付与」で設定したあらゆる権利を意味します。

しかし、これはOperaでのみ機能します。 FFとIE6は両方とも `AccessControlException`をスローします。 しかし、すべてのブラウザでまだうまくいくかもしれません。

次のコードには、2つのメソッド userName2()`と `userName()`があります。 すべてのブラウザでの `userName2() WFM。 `userName()`はOperaでのみ機能します。 HTMLページのボタンを押して確認します。

ご覧のように、 `userName2()`は実際のユースケースではこのようには使用できません(一度しか呼び出せません)。 しかし、同様の問題が発生したときに他の誰かが思いついたソリューションを調べて、それに応じて「userName2()」を拡張することができます

さらに、あなたは私が試していない何かを検討するかもしれません。 javascript-to-javaからのすべての呼び出しは、(必要に応じて)データを渡すだけで、すぐに戻るセキュリティ関連の処理は行いません。 次に、アプレットは実際の作業を行います(上記のリンクのように)。 その後、アプレットが終了すると、 JSObjectplugin.jar)を介してhtmlページにコールバックを起動できます

TestApp.java

import java.applet.Applet;
import java.awt.*;
import java.security.AccessControlException;

public class TestApp extends Applet {
  Label output = new Label("What is the value of user.name?");
  String userName;
  Thread access = new Thread() {
    @Override
    public void run() {
      try {
        userName = System.getProperty("user.name");
      } catch (AccessControlException e) {
        userName = "Oops, failed in thread. No read permissions!";
      }
    }
  };
  public void init() {
    setLayout(new BorderLayout());
    add(BorderLayout.CENTER, output);
  }
  public String userName2() throws InterruptedException {
    access.start();
    access.join();
    output.setText(userName);
    return userName;
  }
  public String userName() {
    String userName = "Oops, failed in liveconnect-context. No read permissions!";
    try {
      userName = System.getProperty("user.name");
    } catch (AccessControlException e) {
      e.printStackTrace();
    }
    output.setText(userName);
    return userName;
  }
}

test.html

test

ポリシー:.java.policy(C:/ Documents and Settings / [USERNAME] /で手動で作成されます。先頭の `.`に注意してください)

grant codeBase "http://[domain].xxx/-" {
  permission java.util.PropertyPermission "user.name", "read";
};


0


今自分で試してみました。

  • サーバー上にあるクラスファイル+ htmlファイル http:// [domain] .xxx /〜someusername / somefolder /

  • クラスファイル+ローカルファイルシステムにあるHTMLファイル C:/ Documents and Settings / [ユーザー名] / Desktop / somefolder

ポリシー: .java.policy(C:/ Documents and Settings / [USERNAME] /にあります。 先頭の `.`に注意してください)

これらのアプレットを使用すると、動作し、 `[USERNAME]`を表示します

grant codeBase "file:///-" {
  permission java.util.PropertyPermission "user.name", "read";
};
grant codeBase "http://[domain].xxx/-" {
  permission java.util.PropertyPermission "user.name", "read";
};

次に、これらを使用しました(Javaコンソールでポリシーファイルをリロード)アプレットが `[USERNAME]`を表示できません

grant codeBase "file:///c/*" {
  permission java.util.PropertyPermission "user.name", "read";
};
grant codeBase "http://[domain].xxx/*" {
  permission java.util.PropertyPermission "user.name", "read";
};

Appelt: TestApp.java

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.security.*;

public class TestApp extends Applet {
  Label output = new Label("What is the value of user.name?");
  public void init() {
    Button button = new Button("Click me!");
    setLayout(new BorderLayout());
    add(BorderLayout.NORTH, button);
    add(BorderLayout.CENTER, output);
    button.addActionListener(
      new ActionListener() {
        @Override
        public void actionPerformed( ActionEvent ev ) {
          try {
            output.setText(System.getProperty("user.name"));
          } catch (AccessControlException e) {
            output.setText("Oops, failed. No read permissions");
          }
        }
      }
    );
  }
}

HTML: index.html


'' '' '

私は今少し混乱しています。 上記の「grant」ステートメントが機能しないと述べ、同時に「デフォルトですべての許可を与える…​ 作品」?

いくつかの質問

  • お使いのブラウザは何ですか?

  • どのjava.policyファイルを編集したか/どこに配置したか

  • URLは実際にはどのように見えますか? myIntranetServerは何か DNSを介して解決できますか? そうでない場合は、Javaにルールの適用に問題があるかもしれません