Genişletilebilir kural tabanlı erişim desen

3 Cevap php

Ben bazı PHP mantığı ile benim statik web kaynakları bazı erişimi kontrol etmek. Web sunucusu aracılığıyla dizin tabanlı yetkilendirme uygun ya da kolayca mümkün değildir çünkü.

Şeylerin bir arada erişim verilen veya reddedilen olup olmadığını belirler. Ve bu kurallar zaman zaman değiştirin.

Başlangıçta basit bir regex yol maçı ve bir oturum değişkeni bir kontrol oldu. Ilgili birkaç değişken var gibi şimdi daha karmaşık.

Ben bu kadar hızlı ve kuralları değiştirmek kolaydır bu üstlenmeden hakkında gitmek nasıl merak ediyorum. "Bu ve bu, daha sonra başka bir 403, teslim eğer." Basit bir iken düz PHP bunu yapmak için iyiydi. Şimdi şartlar daha karmaşık ve içinde yaygın ama biraz farklı koşullar her yuvalama bir çift seviyeleri var. Bu refactor tüm yeterince kolaydır, ama en sezgisel ve güncellemek için kolay değil.

Ben iki şeyden birini düşünüyorum.

  1. Koşulların en üst düzeyinde her biri için sınıfları oluşturulması ve doğru bir Yetkilendir'i almak için bir Strateji Fabrika kullanın. Ortak bit ve ne gerekirse aşırı içeren bir taban sınıftan hepsini türetmek. Bazı koşullar değiştiğinde bu hala çevresinde bazı üreticimizin eğilimli olabileceğini düşünüyorum.

  2. Tür güvenlik duvarı kuralları gibi sipariş kurallar 2d dizi dolaşır basit bir motoru yapmak. Gibi bir şey: <allow|deny>, <auth_group>, <path_regex>, <other vars>

Ben tam aracılığıyla bu bir düşünce değil ama güncellemek için ve aynı zamanda bir insan olarak okumak daha kolay olacak gibi görünüyor.

Sen ne yapardın? Bunun için kullanabileceğiniz kurulmuş bir desen veya kütüphane var mı?

Ben bir süre önce başka bir uygulama bu benzer sorunla karşı karşıya. Ben zincirleme kurallar şekilde güncellemek için kolay istedim ve koşulları çeşitli düzeylerde dayalı birlikte çıktıları nerede. Bu, bu uygulama kadar karmaşık değildir, ama insanlar bu tür bir sorunu çözmek için kullanabileceğiniz desenleri duymak ilgi duyarım.

3 Cevap

Sen kaynakların hiyerarşileri ayrıcalıklar hiyerarşileri yönetmek için nesne yönelimli bir PHP sınıfı, hangi Zend_Acl kontrol etmek isteyebilirsiniz. Bunu olduğu gibi bu bileşeni kullanmak mümkün olmayabilir, ancak size kendi sistemini uygulamak istiyorsanız nasıl içine biraz fikir verebilir.

Zend_Acl Zend Framework PHP 5 sınıf kitaplığı parçasıdır, ancak ZF birçok sınıflar gibi, Zend_Acl bağımsız olarak kullanılabilir. Zend Framework kalanını kullanmaya gerek yok.

Ayrıca kolayca hızlı bir şekilde kurup sorgulamak ya da bir kaynağa erişim izin verilmelidir sağlayacak gerçekleri ve kuralları devlet (prolog düşünüyorum) küçük bir mantık motorunu kullanabilirsiniz. Böyle mantık tabanlı kural motorları genellikle çok verimli ve çok kolay problem alanı için bu tür bir çözüm modeli için izin vermelidir.

Ben Specification Pattern kullanmak istiyorsunuz. Bu kurallar birleştirmek sağlar. Hatta IsSatisfiedBy() yönteminde (desen aşağıdaki) çalıştırmak olacaktır bileşik kural temsil etmek için bir sınıf oluşturmak olabilir.