これで、メソッドを「修飾子なし」としてマークして、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の外部からの直接アクセスは許可されてはなりません。