Ince taneli erişim kontrolü

4 Cevap php

Ben yetki sekmeleri tutmak için geliştirmekte olduğumuz web tabanlı yönetim uygulaması için kullanıcıların kimliğini doğrulamak için yollar, ve hatta çeşitli teknikleri bir sürü aşina değilim ...

Ancak, benim size sorum ben şu sunan bir ince taneli erişim kontrol mekanizmasını uygulamak nasıl öneriyoruz olduğunu:

  1. Kullanıcılar, vb 'roller' veya 'satış elemanı' olarak 'gruplar', 'planlama', ait
  2. Admin menü sistemi kullanıcıları rolü (ler) ile ilgili işlevleri yalnızca sayfalarını 'gösteriyor
  3. Bu sayfaların içinde specfic functions kısıtlamaları var - örneğin, 'yeni rezervasyon' sayfasında, 'satış elemanı' users ', sadece gelecekte' rezervasyon verebilir ve 'düzenle rezervasyonlarında' sayfasında rezervasyonlarında 'bir hafta şimdi düzenleyebilirsiniz '. Ancak, 'planlama' users 'bir hafta önce kadar' geriye dönük kitap için izin olabilir ve düzenlemek rezervasyonu 'herhangi bir süre' için kendileri tarafından yapılan, ancak rezervasyonu sadece 'Yarına kadar' başkaları tarafından yapılan ...

Ben no.1 karşılamak için temel bir rol tabanlı sistem uygulamak biliyorum ... Ben izinleri veritabanı tarama böylece ben kod parçaları, kendi objectID-permissionID ilişkisi her birinin içine tüm uygulama bölünmüş gereken bir duygu var nesneler kullanılabilir olduğunu görmek için - bu no.2 bana yardımcı olacaktır.

Ben 'satış' kullanıcılar için gelecekte bir tarih görüntüler (ancak görüntüler kullanıcıları planlama için 'bir hafta önce' up Tarihleri) örneğin form denetimi, yapı nasıl Herhangi bir fikir, sonra bir şekilde bir çizgi ile bu eşleştirme tarih beklenen aralığında aslında olup olmadığını görmek için denetler POST ayrıştırıcı?

Ben sunucu üzerinde sadece 'dosya' db bağlantı dosyasının böylece ben, dinamik izinleri tabloya göre kod oluşturur bir nesne tablo var, sonra veritabanına her kod yığın tasarruf gereken fikri etrafında oynadım!

Herhangi bir fikir ... hoşgeldiniz (arka plan php olmasa bile / MySQL)


http://vimeo.com/2723800 - "ACL öldü" neden bahsediyorsun Zed Shaw tarafından bir CUSEC sunum sorunu içine biraz daha anlayış

4 Cevap

Warning, a lot of Zend Framework ahead!

Kolayca 1. Ve 2 işleyebilir. Zend_Acl ve Zend_Navigation ile.

3 için size model ACL nesneyi sorgulamak ve elle bir sürü şey yapmak zorunda olacak. Siz de formlar için Zend Framework kullanmak ve kullanıcılar rol iznine bağlı olarak belirli bir form elemanı doğrulayıcılar içerebilir.

EDIT:

Eğer ZF yol gidiyor gibi hissediyorum yoksa en azından ACL ZF ele nasıl bir göz atabilirsiniz.

Gerçek ince taneli erişim denetimi (FGAC) inşa etmek istiyorsanız, sadece MySQL için bu konuda benim yazı edin:

MySQL 5.0 Fine-Grained Access Control (FGAC)

Basically, you don't want your business code be dependent on the FGAC implementation, you don't want to mix FGAC code in where clause of the select statements of your business rules. This article shows solutions to avoid cluttering of SQL statements.

Yerine piggy-destek çerçevesi daha 'yerli' yaklaşımı, implememt amacıyla, ben aşağıdaki ile oynamak oldum. Herkes bu yaklaşımı nasıl değerlendiriyorsunuz? Herhangi tuzaklar öngörüyorsunuz?

// Check database for existence of this $user against this $object.
function get_permission($user, $object){
    // Query goes here...
    if( ... ){
    	return $permission;
    } else {
    	return FALSE;
    }
}

Yukarıdaki işlevi bu gibi veritabanı ve çıkış şey sorgulamak istiyorum:

// Result of role-object query.  
role_ID      object_ID          permission  
-------      ---------          ----------
salesperson  new_booking_date   'min' => 'now', 'max' => '+1 year'  
planning     new_booking_date   'min' => '-1 week', 'max' => '+1 year'  
salesperson  edit_booking_date  'this_user_min' => 'now', 'this_user_max' => '+1 week', 'other_user_min' => 'now', 'other_user_max' => '+1 week'  
planning     edit_booking_date  'this_user_min' => '-1 week', 'this_user_max' => '+1 year', 'other_user_min' => '-1 week', 'other_user_max' => '+1 week'

Form girişi içeren sayfasında aşağıdaki kodu:

// Draw form control with javascript date validation...
$this_permission = get_permission($this_user, 'new_booking_date');
if($this_permission){
    $html->datepicker('min' => $this_permission['min'], 'max' => $this_permission['max']);
}

Rezervasyon yapıldıktan sonra, başka bir sayfa bize bu alanı düzenlemek için izin verir:

// Verify POST data...
$this_permission = get_permission($this_user, 'edit_booking_date');
if($this_permission){
    if($this_user == $author_user && $_POST['date'] >= strtotime($this_permission['this_user_min'], $date_ref) && $_POST['date'] <= strtotime($this_permission['this_user_max'], $date_ref)){
    	// Update database...
    } elseif($_POST['date'] >= strtotime($this_permission['other_user_min'], $date_ref) && $_POST['date'] <= strtotime($this_permission['other_user_max'], $date_ref)){
    	// Update database...
    }
}

Ben rigt yolda mıyım?

Ben çok iyi ihtiyaçlarınızı karşılamak olacağını düşünüyorum PHP-Bouncer adında bir kütüphane geliştirdi. Şu anda sizden (Ben kullanıyorum tavsiye ettiğimiz tabii dahil) her sayfada tek bir çağrı kullanmak ve otomatik yönlendirme insanlar onlar bir sayfaya erişimi yoksa, yanı sıra rolleri otomatik alım sağlayacak tamamen yönetilen erişimini destekler Bir veritabanı (siz dahil MySQL tablo kurulum komut dosyası kullanarak DB rollerini hayata varsa). Sözdizimi oldukça basittir.

Sen fedai oluşturun:

$bouncer = new Bouncer();

Lütfen rolleri Ekle (manuel):

// Add a role     Name,      Array of pages role provides
    $bouncer->addRole("Public", array("index.php", "about.php", "fail.php"));
// Add a role          Name,              Array of pages role provides
    $bouncer->addRole("Registered User", array("myaccount.php", "editaccount.php", "viewusers.php"));
// Add a role          Name,   Array of pages role provides       List of pages that are overridden by other pages
    $bouncer->addRole("Admin", array("stats.php", "manageusers.php"), array("viewusers.php" => "manageusers.php"));

veya veritabanından:

// conf_* values are set in a config file, or you can pass them in explicitly
$bouncer->readRolesFromDatabase(conf_hostname, conf_username, conf_password, conf_schema, "mysql");

Bir kullanıcı eklemek ve onları bazı roller (Not!: Kullanıcı sınıfı uzatabilirsiniz BouncerUser adında bir sınıf ihtiyacınız rol işlevselliği sağlayan, var) vermek:

$user->addRole("Logged In"); // This Role doesn't exist in the bouncer, but we can set it anyways if we feel like setting another flag on the user's account. This can be useful for displaying content in a page only if a user has a secondary role.
$user->addRole("Public");
$user->addRole("Registered User");

Sonra Bouncer dosyalara erişimi yönetmek bakalım:

$bouncer->manageAccess($user->getRoles(), substr($_SERVER["PHP_SELF"], 1), "fail.php");
// Any time the user tries to go to a page they don't have access to, they will get to
// fail.php. Any time they try to go to a page that is overridden for them, they will 
// get to the overriding page.

Bir kullanıcı görüntülemek izni yalnızca bir sayfa içeriğini göstermek istiyorsanız, sadece sarın:

if($user->hasRole("Registered User")){
    echo "The content";
}

Ben bu harika bir çözüm olacaktır açıklanan sorunu için düşünüyorum!