Etki alanı odaklı tasarım ilkelerini kavramaya çalışan küçük bir uygulama üzerinde çalışıyorum. Başarılı olursa, bu daha büyük bir proje için bir pilot olabilir. "Etki Alanına Dayalı Tasarımın Uygulanması" (Vaughn Vernon tarafından) kitabını takip etmeye ve benzer, basit bir tartışma forumu uygulamaya çalışıyorum. Ben de github IDDD örnekleri kontrol ettik. Davam için Kimlik ve Erişimi kabul etmekte bazı zorluklar yaşıyorum. Arka plan bilgisi vereyim:
- (Umarım) kullanıcıları ve izinler mantığını ayırmanın ardındaki mantığı anlıyorum: destekleyici bir alan ve farklı sınırlı bir bağlam.
- Çekirdek etki alanında kullanıcı yok, yalnızca Yazarlar, Moderatörler vb. Var. Bunlar, bir hizmet kullanarak Kimlik ve Erişim bağlamına ulaşarak ve sonra alınan Kullanıcı nesnelerini ve Moderatöre çevirerek oluşturulur.
Etki alanı işlemleri parametre olarak ilgili bir rolle çağrılır: örn:
ModeratePost( ..., moderator);
Etki alanı nesnesinin yöntemi, verilen Moderator örneğinin null olup olmadığını denetler (Kimlik ve Erişim bağlamından istenen kullanıcının Moderatör rolü yoksa Moderator örneği null olur).
Bir durumda, bir Gönderiyi değiştirmeden önce ek bir kontrol yapar:
if (forum.IsModeratedby(moderator))
Sorularım:
İkinci durumda, güvenlik kaygıları tekrar temel etki alanına karışmıyor mu? Daha önce kitaplar, "bir konuyu kimin gönderebileceği ya da izin verilen koşullar altında. Bir Forumun şu anda bir Yazarın bunu yaptığını bilmesi gerekiyor" demektedir.
Kitaptaki role dayalı uygulama oldukça basittir: Bir Moderatör temel etki alanı olduğunda, mevcut userId'yi bir Moderator örneğine veya gerektiğinde bir Yazara dönüştürmeye çalışır. Kullanıcı uygun role sahip değilse hizmet uygun örneğe veya null değerine yanıt verecektir. Ancak bunu daha karmaşık bir güvenlik modeline nasıl adapte edebileceğimi göremiyorum; pilotluk yaptığım şu anki projemizde gruplar, EKL'ler vb. içeren oldukça karmaşık bir model var.
Çok karmaşık olmayan kurallarda bile: "Bir gönderi yalnızca Sahibi veya Editör tarafından düzenlenmelidir", bu yaklaşım bozulur veya en azından onu uygulamak için doğru yolu göremiyorum.
Bir OwnerOrEditor örneği için Kimlik ve Erişim bağlamını sormak doğru gelmiyor ve çekirdek etki alanında giderek daha fazla güvenlikle ilgili sınıflarla karşılaşıyorum. Buna ek olarak, sadece userId değil, korunan kaynağın (yazı, forum vb. Kimliği) güvenlik bağlamına geçmesi gerekirdi, muhtemelen bu şeyleri önemsememelidir (doğru mu? )
Çekirdek etki alanına izinleri alarak ve etki alanı nesnelerinin yöntemlerinde veya hizmetlerinde denetleyerek, birinci kareye geliyorum: güvenlik endişelerini etki alanı ile karıştırmak.
Güvenlik ve izinler temel etki alanı değilse, bir yerde okudum (ve kabul ediyorum) bu izinle ilgili şeylerin temel etki alanının bir parçası olmaması gerekir. Yukarıda verilen gibi basit bir kural, güvenliği temel alanın bir parçası haline getirmeyi haklı çıkarıyor mu?
HasPermissionToEdit(userId, resourceId)
ancak etki alanı mantığını bu çağrılarla kirletme hakkını hissetmiyorum. Etki alanı mantığını çağırmadan önce, muhtemelen uygulama hizmeti yöntemlerinde bu kontrol etmeliyim?
UserService @AccessControlList[inf3rno]
Ben bağlantılı cevap gibi kod bölümlerinden net olduğunu düşündüm .