Uygulamam için Java'da esnek bir ACL çerçevesi oluşturmaya çalışıyorum.
Birçok ACL çerçevesi, bir kuralın sahip: eylem: kaynak biçiminde olduğu bir beyaz kural listesine dayanır . Örneğin,
- "JOHN, FOOBAR-1 kaynağını görüntüleyebilir"
- "MARY FOOBAR-1 kaynağını görüntüleyebilir"
- "MARY FOOBAR-1 kaynağını DÜZENLEDİ"
Bu caziptir çünkü kurallar kolayca veritabanına serileştirilebilir / kalıcı hale getirilebilir. Ancak başvurumun karmaşık bir iş mantığı var. Örneğin,
- "Bölüm 1’deki 5 yıldan fazla kıdeme sahip tüm kullanıcılar FOOBAR-1 kaynağını görebilir, yetkili değil"
- "Bölüm 2'deki tüm kullanıcılar, tarih 15.05.2016 tarihinden sonraysa, FOOBAR-2 kaynağını görebilir, yetkili değil"
İlk düşünce üzerine, bunlar gibi sonsuz karmaşık kuralları kaldırabilecek bir veritabanı şeması tasarlamak bir kabus olurdu. Bu nedenle, derlenmiş uygulamaya bunları "pişirmem", her kullanıcı için değerlendirme yapmam ve daha sonra sahibini yaratmam gerekecek gibi görünüyor : değerlendirme sonucunda değerlendirme : kaynak kuralları. Mantığı derlenmiş uygulamaya yerleştirmekten kaçınmak istiyorum.
Bu yüzden, bir kuralı yüklem şeklinde göstermeyi düşünüyordum : action: resource , yüklemin bir kullanıcının izin verilip verilmeyeceğini belirleyen bir boolean ifade olduğu. Öngörü, Java'nın Rhino motoru tarafından değerlendirilebilecek bir JavaScript ifadesinin bir dizisi olacaktır. Örneğin,
return user.getDept() == 1 && user.seniority > 5;
Bunu yaparken, yüklemler veritabanına kolayca devam ettirilebilir.
Bu akıllıca mı? Bu özensiz mi? Bu numara mı? Bu aşırı mühendislik yapılmış mı? Bu güvenli midir (görünüşe göre, Java, Rhino motorunu sandbox yapabilir).