Erişim kontrolü için standart uygulamalar (tasarım deseni)


9

Benim arayüz tasarımı bakıyorum ve ben rol tabanlı erişim denetimi sağlamak en "doğru" yolu olan karar mücadele ediyorum, verilen userve bir subjecto usererişime istiyorum.


Görebildiğim kadarıyla üç temel seçeneğim var (dördüncüsü ilk üçün piç haline getirilmesi ve beşinci dördün bir tweak olması):

  1. Sahip subjectolduğu izinlerin listesiyle sorgulayın user-subject.allowAccess(user.getPermissionSet)
  2. Gerektiren userizinlerin bir listesini sorgulayın subject-user.hasPermissionTo(subject.getRequiredPermissions())
  3. İzinlerin kesişim noktalarını bulmak için bir üçüncü tarafı sorgulayın - accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
  4. Sorgu ya subject/ user, bir üçüncü taraf sınıfına "karar" devrederek ise
  5. Erişime izin verilmiyorsa erişmeye userçalışın subjectve bir hata atın.

Ben dört seçenek doğru eğilerek - a la operasyonu temsilci çağırmak için subjectbir accessControlleralan içerir subject.userMayAccess(User user):

class Subject {
    public function display(user) {
        if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
            display403(); //Or other.. eg, throw an error..
        }
    }
}

.. ancak daha sonra başka sorular ortaya çıkıyor:

  • accessControllerbir alan vs statik bir sınıf olmalı ..?
  • Görebilmek için hangi izinlerin gerekli olduğunu subject bilmeli misiniz?
  • Arama ile ilgili olarak burada en az bilgi ilkesi nerede devreye girer subject.display()? Arayanlar subject.display()erişim kontrolünün yürürlükte olduğunu bilmeli midir? ( subject.display()son bir "şablon yöntemi" nerede )
  • gelmiş subject.display()kullanıcı gerekli izni yok istisna atan, erişim kontrolü yönetmek?

Bu durumda ne "en iyi uygulama" olarak kabul edilir? Kontrolleri yapma sorumluluğu gerçekte nerede oluşmalıdır?

Bu bir şekilde hem daha sonra uygulamaya geçecek olan akademik bir alıştırma olduğundan, tasarım modellerine referanslar takdir edilecektir.

Yanıtlar:


7

En iyi uygulama, korunan alanlara yapılan çağrıları durdurmak için Interceptor kalıbı olarak bilinen bir şey kullanmaktır.

Bu, erişim giriş noktalarınıza uygulanan AOP veya kesişen konularla elde edilebilir.

Konu asla kimin görüntüleyebileceğini bilmemelidir. Bu, konu kodunu gereksiz yere zorlaştırır ve istemeden aynı işleve doğrudan erişim mekanizması sağlamadığınız sürece bunun gerekmesine gerek yoktur.

Tercihen, arayan ve arayan kişi, reddetme işlemlerinin dışında erişim hakkında bilgi sahibi olmamalıdır. Bununla birlikte, sorun, uyguladığınız sisteme ve arayan kişinin güvenlik kimlik bilgilerine / yöneticisine nasıl eriştiğinize bağlı olacaktır. Örneğin, SOAP sistemlerinde bu bilgiler bir SOAP mesajının başlığına eklenirken, bir Windows sisteminde bu, Windows kimlik doğrulama mekanizması aracılığıyla kullanılabilir.

AOP veya önleyici örüntü yaklaşımını kullanırsanız, gerekli istisnaları atar ve atılan istisnaları ele almak istemciye (arayan) bağlıdır.

Bu şekilde, istemcinizi, hizmetinizi ve kimlik doğrulama kodunuzu bilgi veya işlevsellik arasında bir araya gelmeden ayrı tutarsınız.



2

Ben senin seçenek 3 yakın, ancak bunun yerine sorgulayarak düşünmek userve subjectonların izin kümeleri hakkında size geçmelidir userve subjecterişim denetleyicisi.

class Subject {
    public function display(user) {
        if(!accessController.checkAccess(this, user, AccessControl.Read)) {
            display403(); //Or other.. eg, throw an error..
        }
    }
}

Erişim denetleyicisi, hem izin kümelerini almaktan hem de erişimin yeterli olup olmadığını kontrol etmekten sorumlu olmalıdır. Bu şekilde erişim denetleyicinizdeki hem depolama mantığını hem de kontrol mantığını hem kullanıcıdan hem de nesneden ayrı olarak ayırırsınız.

Örneğinizde muhtemelen eksik olan diğer öğe, hangi işlemin gerçekleştirildiğidir. Eğer bir olabilir Yani Bazı kullanıcılar, vb güncellemesine bazı veriler değil okumak, silmek yürütmek hakkına sahip olabilirler checkAccessüç parametrelerle erişim denetleyicisi üzerinde yöntemini: user, subject, operation. Ayrıca checkAccess, erişimin neden verilmediği hakkında bilgi döndürmek için adresinden bazı ek bilgiler de vermek isteyebilirsiniz .

Örneğin, tüm bunları daha sonra erişim denetleyicisine devretmek, izinlerinizin temsil edilme şeklini değiştirmenize olanak tanır. Rol tabanlı erişim kontrolü ile başlayabilir ve daha sonra hak taleplerine geçebilirsiniz. İzinleri başlamak için basit bir yapıda saklayabilir ve daha sonra farklı konu türlerine hiyerarşik gruplar / roller ve izin verilen işlemler ekleyebilirsiniz. İzin kümelerinizi arayüze koymamak bunu etkinleştirmeye yardımcı olur.

Bunu takmak için AOP veya bazı demirbaş kodu kullansanız da, bence, daha az önemlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.