2012-11-23 5 views
1

이제 메소드를 '수정 자 없음'으로 표시하여 클래스 & 패키지에서만 액세스 할 수 있음을 알았습니다.Java 보안 : 클래스가 특정 패키지에서만 액세스 할 수 있도록하려면 어떻게해야합니까?

이 경우에도 내가 필요한 것은 아닙니다. 내가 필요한 것은 다음과 같습니다.

"Secure.java"클래스의 메소드는 같은 JAR 파일의 다른 클래스에서만 액세스 할 수 있습니다.

(이 추가입니다) 호출이 안전한 방법으로 구성되어

, 호출 스택 다시 다시 다시 A 없음 보안 클래스 &에 가지 않습니다. 예를 들어 :

이 좋다 :

  • com.nonsecure.ClassA.doStuff()
  • com.nonsecure.ClassB.doStuff을 (호출)
  • com.secure.Secure.doStuff를 호출

    ,369 :()는
  • com.secure.SecureB.doStuff()를

이 나쁜입니다 호출

  • com.nonsecure.ClassA.doStuff()는
  • com.nonsecure.ClassB.doStuff()
  • com.secure.Secure.doStuff을 (호출)
  • COM 호출을 호출합니다. 보안되지 않은 .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>() 

을 읽을 수 있지만 액세스하는 자원/네트워크 연결 등에 대해 것 같다했습니다 하지 패키지 보호의 일종을 보장하기 위해 호출 스택에 액세스하는 방법에 대한.

참고 : 나는 봄에게 보안 코드를 포함하는 3

  • JAR 파일을 사용하고

    • 인증서와 을 체결한다.
    • 보안 클래스에 대한 액세스는 JAR 내에서만 에서 이루어 지므로 JAR 외부에서 직접 액세스는 허용되지 않아야합니다. 이 허용됩니다.
  • 답변

    1

    제목에 '힌트를 제공하는 동일한 패키지에서'라고 나와 있습니다.클래스를 액세스 할 수있는 클래스와 동일한 패키지에 넣습니다. 공용으로 만들지 않으므로 해당 패키지의 클래스에서만 액세스 할 수 있습니다. JAR 파일에 서명한다. 패키지를 밀봉하십시오.

    +0

    이 SecureMap 유형의 객체를 사용해야하는 클래스는 최대 700 개까지있을 수 있으며, 한 패키지에 700 개의 파일 (모든 지원 클래스)을 갖고 싶지는 않습니다. –

    +0

    @jeffporter 질문에 새 제약 조건을 추가해야합니다. – EJP

    1

    기본적으로 클래스의 컨테이너 (jar)를 기반으로 액세스 제한을 찾고 있습니다. Java는 자체적으로 그러한 제어를 제공하지 않습니다 (적어도 쉽게는).

    OSGI 사양은 달성하려는 액세스 제어에 더 가깝습니다. 본질적으로 OSGI는 jar 파일 (번들)을 기반으로 액세스 제한 및 규칙을 지원하고 시행합니다.

    당신은 Spring을 사용한다고 말하면서 JavaWorld herehere에서이 기사를 살펴보고 OSGI가 어떤 도움을 줄 수 있는지 확인할 수 있습니다.

    +0

    정보를 제공해 주셔서 감사 드리며, 현재 OSGI를 사용할 수 없습니다. 하지만 나중에 프로젝트에 사용할 수 있습니다. –

    0

    결국 위의 checkSecurity() 메서드를 사용했습니다.

    Java 1.6 기능을 찾지 못했습니다.

    관련 문제