2

これで、メソッドを「修飾子なし」としてマークして、Class&Packageからのみアクセスできるようにできることがわかりました。

しかし、それは私がこの場合に必要なものではありません。私が必要なのはこれです:

クラス「Secure.java」のメソッドには、同じJARファイル内の他のクラスからのみアクセスできます。

AND(これは追加です)

呼び出しが安全なメソッドになされた場合、呼び出しスタックは安全でないクラスに戻ってから再び戻ることはありません。例えば:

これはいい:

  • com.nonsecure.ClassA.doStuff()呼び出し
  • com.nonsecure.ClassB.doStuff()呼び出し
  • com.secure.Secure.doStuff()呼び出し
  • com.secure.SecureB.doStuff()

これは悪いです:

  • com.nonsecure.ClassA.doStuff()呼び出し
  • com.nonsecure.ClassB.doStuff()呼び出し
  • com.secure.Secure.doStuff()呼び出し
  • com。非セキュアな.ClassC.doStuff()は[悪い:セキュアなJARのクラスの外に出ました!]
  • com.secure.SecureB.doStuff()

今、私は少しの手作業でこれを行うことができると思います:

 private void checkSecurity()
  {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    for (StackTraceElement stackTraceElement : stackTraceElements)
    {
      // TODO: Add a little magic to check that we've not stepped outside the secure packages.
      if (!stackTraceElement.getClassName().startsWith("com.secure"))
      {
         throw new SecurityException("Woop!");
      }
    }
  }

質問:これは、Javaがここで私を助けるために提供する何かがあるはずだと感じますか?

私はについて読んだ

AccessController.doPrivileged(new PrivilegedExceptionAction<String>()

しかし、リソース/ネットワーク接続などへのアクセスについてのみであるように思われます。ある種のパッケージ保護を確実にするためにコールスタックにアクセスすることについてではありません。

ノート:

  • Spring3を使用しています
  • セキュアコードを含むJARファイルは、証明書で署名されています。
  • セキュアクラスへのアクセスはJAR内からのみであり、JARの外部からの直接アクセスは許可されてはなりません。
4

3 に答える 3

1

基本的に、クラスのコンテナー (jar) に基づくアクセス制限を探しています。Java は、それ自体でそのような制御を提供しません (少なくとも簡単ではありません)。

OSGI 仕様は、達成したいアクセス制御により近いものです。本質的に、OSGI は、jar ファイル (バンドルと呼ばれる) に基づくアクセス制限とルールをサポートし、適用します。

あなたは Spring を使用していると言います。JavaWorld の記事をここここで見て、 OSGI がどの程度役立つかを確認してください。

于 2012-11-23T11:48:00.320 に答える
1

あなたのタイトルには、ヒントを提供する「同じパッケージから」と書かれています。クラスにアクセスできるクラスと同じパッケージにクラスを入れます。公開しないでください。そのパッケージ内のクラスのみがアクセスできます。JAR ファイルに署名します。そして封をします。

于 2012-11-23T09:45:10.917 に答える