다양한 Java 클래스에 다른 권한을 부여하는 방법은 무엇입니까?
문제
Java 응용 프로그램이 있으며 확장 가능하게 만들고 싶습니다. 확장을 만들기 위해 회사 내의 개발자는 특정 인터페이스를 구현하는 Java 클래스를 작성합니다. 또한 관련 도우미 수업을 작성하고 싶을 수도 있습니다. 이 확장을 중단없이 응용 프로그램에로드하고 싶습니다.
이 수업이 다음과 같이 할 수있는 일을 제한하고 싶습니다.
- 응용 프로그램의 API에서 통화 메소드 (이것은 생성자의 매개 변수가 될 것입니다)
- 동일한 패키지 내에서 다른 객체의 인스턴스를 만듭니다 (따라서 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의 개별 웹 앱은 다른 개별 클래스 로더를 갖는 분리되어 있습니다. 어쩌면 코드를 살펴볼 가치가있을 것입니다.