SORU
7 AĞUSTOS 2010, CUMARTESİ


Nasıl MVC Web uygulama Erişim Kontrol Listesi uygulayabilirim?

İlk soru

Lütfen basit ACL MVC uygulanan olabilir nasıl açıklayayım.

Burada Denetleyicisi Acl kullanarak ilk yaklaşım...

<?php
class MyController extends Controller {

  public function myMethod() {        
    //It is just abstract code
    $acl = new Acl();
    $acl->setController('MyController');
    $acl->setMethod('myMethod');
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...    
  }

}
?>

Çok kötü bir yaklaşım olduğunu, ve eksi her denetleyici yöntemi içine kod Acl parça eklemek zorunda, ama herhangi bir ek bağımlılıkları ihtiyacımız yok!

Bir sonraki yaklaşım ve kontrol yöntemleri private ve denetleyici içine ACL kod Ekle 9 ** yöntemi.

<?php
class MyController extends Controller {

  private function myMethod() {
    ...
  }

  public function __call($name, $params) {
    //It is just abstract code
    $acl = new Acl();
    $acl->setController(__CLASS__);
    $acl->setMethod($name);
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...   
  }

}
?>

Önceki kod daha iyidir, ama ana eksileri

  • Kontrol yöntemleri özel olmalıdır
  • __Bu yöntemi çağırın her denetleyici içine ACL kodu eklemek lazım.

Bir sonraki yaklaşım ana Denetleyicisi olarak Acl kod koymak, ama hala çocuk denetleyicisi yöntemleri özel tutmak gerekir.

Çözüm nedir? Ve en iyi uygulama nedir? Nerede Acl işlevleri karar veya yöntem idam edilmesine izin vermemek için arayayım.

İkinci soru

İkinci soru Acl kullanarak rol alıyor. Hadi misafirler, kullanıcılar ve kullanıcı arkadaşlarımız var düşünün. Kullanıcı sadece arkadaşların görebileceği profilini görüntülemek için kısıtlı erişim var. Tüm konuklar bu kullanıcı profilini görüntüleyin. Yani, burada mantık..

  • çağrılan yöntemi profili olduğundan emin olmak için var
  • bu profilin sahibi tespit ettik
  • izleyici bu profilin sahibi olduğunu da tespit ettik
  • kısıtlama kuralları okumak hakkında bu profilimiz var
  • karar yürütme veya profil yöntemi uygulamak değil

Ana soru profil sahibi tespit. Sadece profil sahibi model model -^ yöntem $yürütülen kim olduğunu tespit edebiliriz . () getOwner, ama Acl modeli için erişiminiz yok. Nasıl bu hale getirebiliriz?

Düşüncelerim nettir umarım. Benim İngilizce için özür dilerim.

Teşekkür ederim.

CEVAP
13 Mart 2012, Salı


BİRİNCİ BÖLÜM/cevap (ACL uygulama)

Benim düşünceme göre, bu yaklaşım en iyi yolu decorator pattern, Temelde, bu nesne almak anlamına gelir, ve bunun yerine kullanmak olacaktıriçindebaşka bir koruyucu bir kabuk gibi hareket edecek nesne. Bu, özgün sınıf uzatmaya gerek duymaz. İşte bir örnek:

class SecureContainer
{

    protected $target = null;
    protected $acl = null;

    public function __construct( $target, $acl )
    {
        $this->target = $target;
        $this->acl = $acl;
    }

    public function __call( $method, $arguments )
    {
        if ( 
             method_exists( $this->target, $method )
          && $this->acl->isAllowed( get_class($this->target), $method )
        ){
            return call_user_func_array( 
                array( $this->target, $method ),
                $arguments
            );
        }
    }

}

Ve bu yapı, bu tür kullanımı nasıl olur:

// assuming that you have two objects already: $currentUser and $controller
$acl = new AccessControlList( $currentUser );

$controller = new SecureContainer( $controller, $acl );
// you can execute all the methods you had in previous controller 
// only now they will be checked against ACL
$controller->actionIndex();

Fark edebileceğiniz gibi, bu çözüm, birçok avantajı vardır:

  1. çevreleme herhangi bir nesne değil, sadece Controller örnekleri üzerinde kullanılabilir
  2. yetki için onay anlamına gelir hedef nesne, dışarıyla:
    • orijinal nesne erişim denetimi, SRP yapışır sorumlu değildir
    • döndüğünde "izin verilmedi", bir kontrolör içinde kilitli değil, daha fazla seçenek
  3. bu enjekte edebilirsinizörnek güvenlibaşka bir nesne, koruma korur
  4. sar & edebilirsin .. unut gitsinfarz etözgün nesne olduğunu, aynı şekilde tepki verecektir

Amaonay güvenli nesne uygular ve arayüzü de mevcut yöntemleri araştırmak için geçerlidir ) ise doğal olamaz da - bu yöntem ile büyük bir sorunu vardır ya da bazı kalıtım zincirinin bir parçasıdır.

İkinci bölüm/cevap () nesneleri için RBAC

Bu durumda tanıyor olmalısın temel fark buEtki Alanı Nesneleridetay içerir (örnek: Profile) sahibi. Bu Eğer (ve hangi düzeyde) kullanıcı erişimi olup olmadığını kontrol etmek için, bu hattı değiştirmek gerekir anlamına gelir:

$this->acl->isAllowed( get_class($this->target), $method )

Aslında iki seçeneğiniz vardır:

  • Söz konusu nesne ile ACL sağlamak. Ama Law of Demeter ihlal için dikkatli olmak gerekir:

    $this->acl->isAllowed( get_class($this->target), $method )
    
  • Tüm ilgili bilgi isteği ve de biraz ünitesi-test daha yapacak olan ihtiyacı, ne tek dostu: ACL sağlamak

    $command = array( get_class($this->target), $method );
    /* -- snip -- */
    $this->acl->isAllowed( $this->target->getPermissions(), $command )
    

Kendi uygulama ile gelip yardımcı olabilecek birkaç video:

Yan notlar

MVC Modeli ne oldukça yaygın ( ve tamamen ) yanlış anlama var gibi görünüyor.Örnek bir sınıf değildir. Eğer sınıf FooBarModel adlı ya AbstractModel devralan bir şey varsa, yanlış yapıyorsun.

Uygun bir MVC Modeli pek çok ders içeren bir katman vardır. Büyük sınıflar parçası iki grup sorumluluğuna dayalı olarak ayrılabilir:

-Etki Alanı İş Mantığı

(daha fazla bilgi edinin: here here):

Sınıfların bu gruptan örnekleri dediğiniz değerleri hesaplama ile başa çıkmak, farklı koşullar için kontrol satış kuralları uygulamak ve gerisini "iş mantığı". Veriler kaydedilir ve saklanır nasıl depolama ilk yer varsa bile hiçbir fikirleri yok.

Etki İş nesne veritabanına bağlı değildir. Fatura oluşturulurken, verilerin nereden geldiği önemli değildir. Ya da uzak bir DİNLENME API, ya da İhtiyacı olan bir belgenin ekran görüntüsü bile SQL veya olabilir. İş mantığı değişiyor mu hayır.

-Veri Erişimi ve Depolama

Örnekleri sınıfların bu gruptan yapılan bazen Veri Erişim Nesneleri denir. Genellikle Data Mapper desen uygulayan yapıları ( aynı adı ORMs hiçbir ilişkisi .. ile karıştırmayın ). Bu SQL ifadelerinizi olacağı (ya da belki senin DomDocument XML içinde saklayın çünkü).

İki parçadan yanında, belirtilmesi gereken örnekleri/sınıflar tek grup vardır:

-Hizmetleri

Bu sizin ve 3. parti bileşenleri oyuna gelmek olduğunu. Örneğin, "" kendi tarafından sağlanacak olan hizmet, ya da bazı harici kod olarak. kimlik doğrulaması aklınıza Ayrıca "" bir PHPMailer veya SwiftMailer veya posta gönderen bileşen kendi başına bazı etki alanı nesne örgü beraber olabilecek bir hizmet. posta gönderen

services başka bir kaynak etki alanı ve veri erişim katmanları için soyutlama. Kodu denetleyicileri tarafından kullanılan kolaylaştırmak için oluşturulur. Örneğin: yeni kullanıcı hesabı oluşturma birkaç ile çalışmak isteyebiliretki alanı nesnelerivemappers. Ama, bir hizmet kullanarak, denetleyici sadece bir veya iki satır gerekir.

Hizmetleri yapmak, zaman hatırlaman gereken şey tüm katman olması gerekiyorince. Services iş mantığı yok. Sadece etki alanı nesnesi, bileşenleri ve mappers dengelemek için.

Bir şeylerin hepsinin ortak yönü olabilir ki hizmetleri etkilemez Görünüm katmanında herhangi bir doğrudan yolu, ve özerk için böyle bir ölçüde, bunlar ( ve çık sık ) kullanılan dış MVC yapısı kendisi. Ayrıca kendini sürekli böyle yapıları farklı çerçeve/bir mimarlığa geçiş çok daha kolay, hizmet ve uygulama geri kalanı arasında son derece düşük kaplin çünkü yapmak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008
  • Showtime

    Showtime

    21 HAZİRAN 2006