문제

Java 응용 프로그램이 있으며 확장 가능하게 만들고 싶습니다. 확장을 만들기 위해 회사 내의 개발자는 특정 인터페이스를 구현하는 Java 클래스를 작성합니다. 또한 관련 도우미 수업을 작성하고 싶을 수도 있습니다. 이 확장을 중단없이 응용 프로그램에로드하고 싶습니다.

이 수업이 다음과 같이 할 수있는 일을 제한하고 싶습니다.

  1. 응용 프로그램의 API에서 통화 메소드 (이것은 생성자의 매개 변수가 될 것입니다)
  2. 동일한 패키지 내에서 다른 객체의 인스턴스를 만듭니다 (따라서 Extension 클래스의 저자는 다른 클래스를 사용하여 작업을 완료 할 수 있습니다).

클래스가 호출되면 전달 된 API 객체는 이미 "고객"이 멤버 변수로 정의되고 저장되어 있습니다. 이를 사용하여 API를 통한 액세스를 해당 고객의 데이터로 제한합니다.

이 클래스는 데이터베이스에 액세스하거나 디스크에 쓰기 또는 다른 일을하는 것과 같은 일을하는 것을 원하지 않습니다. 이것은 대부분의 개발자 팀이 확장자와 핵심을 모두 작성하는 데 액세스 할 수있는 종속성 관리 및 캡슐화에 대한 노력입니다. 체계.

이것에 대한 패턴이 있습니까? 내가 올바른 길을 가고 있습니까?

도움이 되었습니까?

해결책

이국적인 것을 찾을 필요는 없습니다. 이 시나리오를 처리하는 것은 Java Security Architecture의 기본 기능입니다.

모든 클래스에는 "Codebase"가 있으며,이 위치는로드 된 위치입니다. 따라서 각 확장을 별도의 항아리에 (또는 별도의 디렉토리로 폭발)로 포장하면 해당 코드베이스에 부여 된 권한을 조정할 수 있습니다.

귀하의 경우에는 더 간단하게 들립니다. 내가 올바르게 이해하면 모든 확장에는 동일한 권한이 있으며, 이는 상위 응용 프로그램의 특권보다 적습니다. 따라서 그들은 모두 코드베이스를 공유 할 수 있습니다.

다음은 정책 파일의 예입니다.

grant codeBase "file:/path/to/app/lib/*" {
  permission java.io.FilePermission "/path/to/app/-", "read";
  permission java.io.FilePermission "/path/to/app/data/-", "read,write,delete";
};

grant codeBase "file:/path/to/app/ext/*" {
  permission java.util.PropertyPermission "java.io.tmpdir", "read";
  permission java.io.FilePermission "${java.io.tmpdir}/myapp/-", "read,write,delete";
};

이 간단한 예는 작동해야합니다 Java의 모든 버전. 최신 버전이 있습니다 확장 된 정책 구문 JAAS가 인증 한 주제에 대한 권한을 부여합니다.

다른 팁

구현 세부 사항을 모르겠지만, 당신이 염두에두고있는 것 같습니다. 아파치 톰 캣 서버는 이미 그렇습니다. Tomcat의 개별 웹 앱은 다른 개별 클래스 로더를 갖는 분리되어 있습니다. 어쩌면 코드를 살펴볼 가치가있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top