Saya mencoba membuat kerangka kerja ACL yang fleksibel di Java untuk aplikasi saya.
Banyak kerangka kerja ACL dibangun di atas daftar putih aturan, di mana aturan ada dalam bentuk pemilik: action: resource . Sebagai contoh,
- "JOHN bisa MELIHAT sumber daya FOOBAR-1"
- "MARY can VIEW resource FOOBAR-1"
- "MARY can EDIT resource FOOBAR-1"
Ini menarik karena aturan dapat dengan mudah diserialisasi / dipertahankan ke database. Tetapi aplikasi saya memiliki logika bisnis yang kompleks. Sebagai contoh,
- "Semua pengguna di departemen 1 dengan senioritas lebih dari 5 tahun dapat MELIHAT sumber daya FOOBAR-1, jika tidak, tidak boleh"
- "Semua pengguna di departemen 2, jika tanggalnya setelah 15/3/2016, dapat MELIHAT sumber daya FOOBAR-2, kalau tidak, tidak akan diizinkan"
Setelah dipikirkan pertama kali, akan menjadi mimpi buruk untuk menyusun skema basis data yang dapat menangani aturan yang sangat rumit seperti ini. Oleh karena itu, sepertinya saya perlu "memanggang" mereka ke dalam aplikasi yang dikompilasi, mengevaluasi mereka untuk setiap pengguna, dan kemudian menghasilkan pemilik: tindakan: aturan sumber daya sebagai hasil dari evaluasi. Saya ingin menghindari memanggang logika ke dalam aplikasi yang dikompilasi.
Jadi, saya berpikir untuk mewakili aturan dalam bentuk predikat : action: resource , di mana predikatnya adalah ekspresi boolean yang menentukan apakah pengguna diizinkan. Predikatnya akan berupa string ekspresi JavaScript yang dapat dievaluasi oleh mesin Rhino Java. Sebagai contoh,
return user.getDept() == 1 && user.seniority > 5;
Dengan melakukan itu, predikat dapat dengan mudah disimpan ke dalam basis data.
Apakah ini pintar ? Apakah ini ceroboh ? Apakah ini menarik perhatian ? Apakah ini rekayasa berlebihan ? Apakah ini aman (rupanya, Jawa bisa mem-sandbox mesin Rhino).