Tôi đang cố gắng tạo một khung ACL linh hoạt trong Java cho ứng dụng của mình.
Nhiều khung ACL được xây dựng trên danh sách trắng các quy tắc, trong đó quy tắc ở dạng chủ sở hữu: hành động: tài nguyên . Ví dụ,
- "JOHN có thể XEM tài nguyên FOOebar-1"
- "MARY có thể XEM tài nguyên FOOebar-1"
- "MARY có thể EDIT tài nguyên FOOebar-1"
Điều này hấp dẫn bởi vì các quy tắc có thể dễ dàng được tuần tự hóa / duy trì vào cơ sở dữ liệu. Nhưng ứng dụng của tôi có logic kinh doanh phức tạp. Ví dụ,
- "Tất cả người dùng trong bộ phận 1 với hơn 5 năm thâm niên có thể XEM tài nguyên FOOebar-1, người khác không được ủy quyền"
- "Tất cả người dùng trong bộ phận 2, nếu ngày sau ngày 15/03/2016, có thể XEM tài nguyên FOOebar-2, nếu không thì không được phép"
Theo suy nghĩ đầu tiên, sẽ là một cơn ác mộng khi nghĩ ra một lược đồ cơ sở dữ liệu có thể xử lý các quy tắc vô cùng phức tạp như các quy tắc này. Do đó, dường như tôi sẽ cần phải "nướng" chúng vào ứng dụng đã biên dịch, đánh giá chúng cho từng người dùng và sau đó tạo ra chủ sở hữu: hành động: quy tắc tài nguyên do kết quả của việc đánh giá. Tôi muốn tránh nướng logic vào ứng dụng được biên dịch.
Vì vậy, tôi đã nghĩ đến việc biểu diễn một quy tắc dưới dạng vị ngữ : hành động: tài nguyên , trong đó vị từ là biểu thức boolean xác định xem người dùng có được phép hay không. Vị ngữ sẽ là một chuỗi biểu thức JavaScript có thể được đánh giá bởi công cụ Rhino của Java. Ví dụ,
return user.getDept() == 1 && user.seniority > 5;
Khi làm như vậy, các vị từ có thể dễ dàng được lưu vào cơ sở dữ liệu.
Điều này có thông minh không? Đây có phải là cẩu thả ? Đây có phải là phô trương ? Đây có phải là quá thiết kế ? Điều này có an toàn không (rõ ràng, Java có thể sandbox động cơ Rhino).