Zend Auth ve ACL

4 Cevap php

Bazı Ben şu anda bir PHP çerçeve kullanarak benim ilk site geliştiriyorum, bana biraz yardımcı olabilir umuyorum, sitenin parçası bir üye alanda döküldü, bu benim karışıklık Normal istiyorum üye alanı withing, yüzey başlar nerede üye Ben sadece oturumda depolanan kullanıcı adı karşı posterler adını kontrol edebilirsiniz yeterince basit, yeni yorum eklemek ve orada kendi yorumlarınızı düzenlemek edebilmek için, benim karışıklık 'normal' kullanıcılar ve üst düzey kullanıcılar ayırt ile geliyor vb herhangi olanlar yorum silme ve değiştirme yeteneğine sahip olan, aynı zamanda sitenin yönetici bölümüne erişmek gerekir.

Benim sorum, veya her kullanıcı türü için Zend_Auth kullanarak ya da tüm bu Zend_Acl kullanılarak ele alınabilir ayrı kontrolörler aynı Zend_Auth denetleyicisi üzerinden tüm kullanıcı girişi olmalı mıyım? Herhangi bir yardım, tavsiye, makale veya öğreticiler minnetle mutluluk duyacağız. Şahsen ben Zend dokümantasyon bazı sınıfları biraz ham olduğunu düşünüyorum.

Şimdiden teşekkürler

sico87

4 Cevap

Ben bu büyük bir up-to-date, giriş olarak Manning Neşriyattan kitabı "Eylem Zend Framework" öneriyor. Bu PDF olarak yüklenebilir, bu yüzden şimdi o olabilir :)

Ama bu özel soruyu cevaplamak için:

Let's start by defining two key terms. The "Auth" in Zend_Auth refers to Authentication, which proves someone is who they say they are (i.e. login). The "A" in Zend_Acl refers to Authorization, which proves someone has the right to do what they're trying to do (i.e. access control).

Assuming the user has a single role... Store the user's roles in the "identity" you get as part of Zend_Auth. At login:

$auth = Zend_Auth::getInstance();
$identity = new stdClass();
$identity->user_pk = $user->getPrimaryKey();
$identity->user_name = $user->getName();
$identity->role = $user->getRole(); // select * from user_role where user_pk=xxx
$auth->getStorage()->write($identity);

Controller:

$acl->add(new Zend_Acl_Resource('news'))
->allow('defaultRole', 'news');

Her şey varsayılan olarak reddedilir, yani gerçekten belirtmeniz gerekmez:

->deny('defaultRole', 'news', 'add');

Dahası Denetçi'nin kod içinde:

$identity = Zend_Auth::getInstance()->getIdentity();
if(!$acl->isAllowed($identity->role, 'news', 'add'))
{
   header('Location: http://www.yoursite.com/error/unauthorized');
}

Kullanıcının kimliği "haber-> add" yapmak için izin verilmez ise, (böyle bir sayfa yaptık varsayarak) izinsiz sayfada onları yönlendirir.

If the user had >1 role, you'd store an array of roles in their identity. Then your check would go something like this:

$identity = Zend_Auth::getInstance()->getIdentity();
$isAllowed = false;
foreach($identity->role as $role)
{
   if($acl->isAllowed($role, 'news', 'add'))
   {
      $isAllowed = true;
   }
}
if(!$isAllowed)
{  // if NO ROLES have access, redirect to unauthorized page
   header('Location: http://www.yoursite.com/error/unauthorized');
}

Umut olur.

Evet, çoğu durumda da kimlik tüm aynı kontrolör geçmesi gerekir. Ancak, Zend Auth bir denetleyici türü değil. Zend Auth bir veritabanı veya http gibi ortak kimlik doğrulama yöntemlerini kullanan bir API. Onun işi sadece doğrulama kodunu yazma homurtu iş çevresinde bir sarıcı olmak gerçekten.

Zend Acl Eğer normal ve ayrıcalıklı kullanıcılar arasında ayrım arıyoruz budur. Kullanıcıların doğrulanmış ve içeri giriş yaptıktan sonra sadece Zend Acl dahil

Ne gerek çoğu ZF belgelerde. Bu benim için büyük anlam yapmadan önce hemen hemen tüm Auth ve Acl için belgelerin okudum. ZF Auth, ACL, Storage_ * ve diğer sınıfları çok yakından birlikte kullanıldığında bile, hepsi çok farklı amaçlara hizmet. Biraz zaman onlar güzel birbirlerine üzerine inşa göreceksiniz.

Seni almak için bağlantılar bir çift başladı:

Pádraic Brady's ZF Tutorial

Zend's DevZone article on ACL and MVC

Eğer bocalama neden anlayabiliyorum. I / hala biraz karıştı oldu. Yani, ne yazık ki doğrudan cevap veremem. Ama benim kafamda tüm bu şeyleri netleştirmek için yapıyorum bir şey veritabanı kayıtlarına aksine 'etki alanı nesneleri' açısından düşünmektir.

Bu konu ile ilgili benim taktik kullanıcı kimlik bilgileri ile birlikte bir 'Kullanıcı temel nesnesi' geçirilir kendi Auth Adaptörü oluşturmaktır. Benim 'Kullanıcı Base' tür kullanıcılarının bir depo gibidir.

So the Zend Auth is left being 'an interface' to other Zend Components whilst i still have a bit more control over my system for storing and accessing 'Users'. My User_Base class could be a wrapper around a Zend Db tbl or even just have some hard code in it that i can use for testing.

Yani genel olarak

  • Bir 'kullanıcı' kendi modelini tasarım

  • http://framework.zend.com/manual/en/zend.auth.html: Burada belirtilen gerekli minimum arayüzü ile başlayan - kendi Auth Adaptörü tasarım

  • ve sadece basit tüm tutmak ve bu konuda daha fazla bilgi olarak yavaş gitmek.

iyi ki i olacak zaten yapacağım budur.

Ben kafamda Auth açık var til bile olacak henüz Zend ACL ile rahatsız değil.


Ben eski bir siteyi yeniden canlandırma ve Zend MVC için dönüştürme ediyorum

Bunlar benim 'model' çalışması için vâkıf zorunda (belki alışılmadık) bazı şeyler vardır. :

  • OpenID, eski kullanıcıların tablo, yeni kullanıcılar tablo, kısacık misafirler, vb - bir uygulamayı birden çok 'kullanıcı üslerinden' dan kullanıcılar tarafından kullanılabilir
  • Bir konukların kimliği sadece onlar ilk geldiğinde oluşturulan bir karma olabilir
  • oysa, eski bir kullanıcının kimliğini mirası kullanıcıların tabloda bir kimlik ile temsil edilebilir
  • Kullanıcıların ve user_accounts ayrı şeylerdir. Bu karmaşık alabilir çünkü bir kavram içine karıştırmak kalkmayın.
  • Sistemde hesaplar, birçok farklı türde olabilir. Yani Alıcılar Satıcılar hesapları karşı Hesapları. Writers_Account karşı Readers_Account
  • hesapları kullanıcıların 'var' - 'birincil hesap sahibi', 'admin süper kullanıcı', vb
  • (tüm kullanıcı üsleri tüm kullanıcıların yerel bir alt kümesi) 'account_users', diyelim ki, tarafından kullanıcılar ve hesap arasındaki ilişki temsil edilir
  • rolleri arew account_users (yani belirli bir hesaba kullanıcıları) eklenmiş. (etrafında yüzen rollerin aksine)
  • örneğin yönetici uygulaması, üyeleri uygulaması, ön uç uygulaması - Bir web sitesi temsil etmek için bir sunucu üzerinde birden fazla Zend uygulama var korkmayın.
  • Bu uygulamalar doğrudan / uygulama / modelleri / foomodel klasörlerde oturan tek app ilgilidir tek model kodu ile, 'paylaşılan modeller' klasörü demek saklanan modeli nesneleri kullanmasına izin korkmayın.
  • Her uygulama kendi özel Auth adaptörü olabilir
  • Bir yönetici auth adaptörü sadece bir ön uç uygulamasının Auth adaptörü ise 'admin Kullanıcılar tablosunun' den kullanıcıların konuk userbase, personeli veya üye kullanıcı tabanından kullanıcıların kimliğini doğrulamak mümkün olabilir izin verebilir.
  • ön-uç üyesi oturum açtığında oturum yükselti üzerine silinir ve üye oturumu replced olan apps bir Speical durum olabilir
  • Kimseyi anda webclient başına app başına bir kullanıcı nesnesi (misafir kullanıcı ve üye kullanıcı ile kişinin başvuru çalışırken aksine - bu çok karmaşık)
  • Aynı anda konuk oturumu ve bir üye oturumu ile 'kullanmadan kişiye' başvurmak için çalışırken karşı (tekrar - app kullanıcı başına bir oturum (bunlar etki üzerinde oturum açmış olabilir diğer uygulamalar ile çatışmaları önlemek için isimalanlı). , bu çok karmaşık)

ok i bırakmalıyız başlıyorum .... ama fikir olsun. Gördüğünüz Zend_Auth + Zend Db öğreticiler kendi modelinizi tesir izin vermeyin. onlar sadece örnek basitleştirilmiş.

nuff dedi

Ben bu kod parçası hakkında bir kaç soru var

    $auth = Zend_Auth::getInstance();
    $identity = new stdClass();
    $identity->user_pk = $user->getPrimaryKey();
    $identity->user_name = $user->getName();
    $identity->role = $user->getRole(); // select * from user_role where user_pk=xxx
    $auth->getStorage()->write($identity);

    $identity = Zend_Auth::getInstance()->getIdentity();

User_pk, kullanıcı_adı ve rol çerezler olarak saklanır? Web sitelerinin güvenli parçalarını erişebilir rol adı ile bir tanımlama yapar birileri olacak mı? (Md5-şifrelemesi ile) bir şifre de bu nedenle her isteği ile kullanıcı adınızı ve şifrenizi kontrol edebilirsiniz zaman Kimliğine parçası olmalıdır?