2012-11-23 68 views
1

現在我知道我可以將方法標記爲「無修飾符」,以便它只能通過類&包訪問。Java安全性:如何確保類只能訪問特定的包?

這不是我在這種情況下需要的。我需要的是:

類「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()調用
  • 融爲一體。 不安全 .ClassC.doStuff()調用[BAD:我們去了外班在安全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>() 

但似乎只是有關訪問資源/網絡連接等 不是關於訪問調用堆棧,以確保某種包裝的保護。

注:

  • 我使用Spring 3
  • 包含安全代碼的JAR文件使用證書籤名 。
  • 在JAR內部對安全類的訪問只能從 開始,JAR外部的直接訪問不允許爲 。

回答

1

您的標題說'來自同一個包'提供了提示。將類放入與可以訪問它的類相同的包中;不要公開,因此只能通過該包中的類進行訪問;簽署JAR文件;並密封包裝。

+0

這將會被發現,但可能會有多達700個類需要使用這個SecureMap類型的對象,我真的不想在一個包中包含700個文件(+他們所有的支持類)。 –

+0

@jeffporter你需要添加新的約束到你的問題。 – EJP

1

您基本上正在尋找基於您的類的容器(jar)的訪問限制。 Java本身並不提供這種控制(至少不太容易)。

OSGI規範更接近您想要實現的訪問控制。實質上,OSGI根據jar文件(它稱爲)支持和實施訪問限制和規則。

你說你在用Spring:也許看看JavaWorld herehere的這些文章來檢查OSGI可以幫助你的程度。

+0

感謝您的信息,我目前無法使用OSGI。但我可能會在稍後使用它來做一個項目! –

0

最後我使用了上面的checkSecurity()方法。

我沒有找到Java 1.6的功能來幫助我。