2008-11-22 47 views
6

Tôi có một ứng dụng Java và tôi muốn làm cho nó có thể mở rộng. Để tạo một phần mở rộng, các nhà phát triển trong công ty của chúng tôi sẽ viết một lớp Java thực hiện một giao diện nhất định. Họ cũng có thể viết các lớp trợ giúp liên quan. Tôi muốn tải các phần mở rộng này vào ứng dụng mà không bị mất điện.Làm cách nào để cấp các quyền khác nhau cho các lớp Java khác nhau?

Tôi muốn giới hạn những gì lớp này có thể làm những điều sau đây:

  1. phương pháp gọi trong API của ứng dụng (điều này sẽ là một tham số để các nhà xây dựng)
  2. Tạo các trường hợp của các đối tượng khác trong cùng một gói (do đó tác giả của lớp mở rộng có thể sử dụng các lớp khác để hoàn thành công việc).

Khi lớp được gọi là đối tượng API được chuyển vào sẽ có "khách hàng" được xác định và lưu trữ dưới dạng biến thành viên. Nó sẽ sử dụng điều này để giới hạn truy cập thông qua API cho dữ liệu của khách hàng đó.

Tôi không muốn những lớp này làm những việc như truy cập cơ sở dữ liệu, ghi vào đĩa, hoặc làm những thứ khác. Điều này chủ yếu là nỗ lực quản lý và đóng gói phụ thuộc vì cùng một nhóm nhà phát triển sẽ có quyền viết phần mở rộng và hệ thống cốt lõi.

Có mẫu cho điều này không? Có phải tôi đang trên đường ray bên phải không?

Trả lời

10

Bạn không cần phải tìm bất cứ điều gì kỳ lạ. Xử lý kịch bản này là một tính năng cơ bản của kiến ​​trúc bảo mật Java.

Mọi lớp đều có "mã cơ sở", vị trí mà từ đó nó được tải. Vì vậy, nếu bạn đóng gói mỗi phần mở rộng trong một JAR riêng biệt (hoặc phát nổ trong một thư mục riêng biệt), bạn sẽ có thể điều chỉnh các quyền được cấp cho codebase đó.

Trong trường hợp của bạn, nó nghe còn đơn giản hơn. Nếu tôi hiểu chính xác, tất cả các tiện ích mở rộng sẽ có các đặc quyền giống nhau, ít hơn các tiện ích của ứng dụng gốc. Vì vậy, tất cả họ có thể chia sẻ một codebase.

Dưới đây là một ví dụ về một tập tin chính sách:

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"; 
}; 

ví dụ đơn giản này sẽ làm việc trong any version of Java. Các phiên bản mới hơn có extended policy syntax để cấp quyền cho đối tượng được JAAS xác thực.

2

Tôi không biết chi tiết triển khai, nhưng có vẻ như những gì bạn nghĩ đến gần với máy chủ Apache Tomcat đã thực hiện. Các ứng dụng web riêng lẻ trong Tomcat được giữ riêng biệt với các trình nạp lớp riêng lẻ khác nhau. Có lẽ nó có giá trị khi xem mã ở đó.

Các vấn đề liên quan