Zend Framework 1.9 doğrulama / yetkilendirme / erişim kontrolü tam bir örnek Need

1 Cevap php

Ben çalışan bazı Zend Framework uygulamaları var ve kullanıcı erişim kısıtlamaları ekleme zamanı geldi. Ben mümkün kendi güvenlik altyapısı haddeleme ve bu yüzden başarı olmadan bugüne kadar, bunu uygulamak için Zend_Auth ve Zend_Acl nasıl kullanılacağını anlamaya çalışıyorlar önlemek için çalışmalısınız bir inancı.

Ben net üzerinden tüm arandı, ve en az bir kitap ve ben birlikte parçaların nasıl dize bütün bir örnek bulamıyorum var. Ben, kimlik yetkilendirme / erişim kontrolü here ve here ve here, eski örnekler ve geleceğe yönelik önerileri here bir örneği bulundu here, ve here, ama şimdiki hep birlikte koymak için yeterince iyi ZF anlamıyorum.

Neye ihtiyacım şudur: basit bir genel örnek ya öğretici olduğunu [indirilebilir ve koşulabilir kodu olarak] tamamen detayları Zend Framework açıklaması (1.9.5, hayır "önerileri" veya "laboratuarlar") yönetmek için kimlik doğrulama / yetkilendirme nasıl kullanılacağını / erişim üç farklı roller varsayılan modülünde üç farklı kontrol korumak için (örneğin, misafir, üye, yönetici) üç kullanıcıları (ve onların şifrelerinin) kontrolü. Bu örnek, mümkün olduğu kadar mevcut ZF kütüphanesinin kadar kullanmalıdır. Ve hayır, bu ev ödevi değildir; kazıklar bu :-( daha yüksektir

Bir yerde varsa ben bulamadım. Herhangi bir yardım takdir. IMO bu ZF yeni başlayanlar için çok yararlı olacaktır.

Bilgilendirme: ben onunla devam edeceğiz olmadığını anlamaya çalışıyorum beause ben ZF here üzerine bir topluluk wiki sorum var. Ama gerçekten benim uygulamalar şimdi çalışan almak gerekiyor!

1 Cevap

Pro Zend Framework Techniques, Bölüm 8 bu güzel bir tedavisi vardır. Yaklaşımının çoğu preDispatch yöntemin haricinde, kullanıyorum oldukça benzer. Kimlik doğrulaması yaparken ben preDispatch yerine sessizce başka bir denetleyiciye sevk yönlendirme var. Ayrıca giriş eylem kullanımı için istenen URL korur.

class SitePluginAuth extends Zend_Controller_Plugin_Abstract
{
 private $_auth;
 private $_acl;

 private $_noauthPath = '/account/log-in/';
 private $_noacl = array('module' => 'default', 'controller' => 'error', 'action' => 'denied');

 public function __construct($auth, $acl)
 {
  $this->_auth = $auth;
  $this->_acl = $acl;
 }

 public function preDispatch($request)
 {
  $resource = $request->controller;
  if (!$this->_acl->has($resource)) return;

  $controller = $request->controller;
  $action = $request->action;
  $module = $request->module;

  if ($this->_auth->hasIdentity()) {
   $identity = $this->_auth->getIdentity();
   $role = 'member';
  }
  else {
   $role = 'guest';
  }

  /*
   * Remember to URL encode the parameter value. Also, when you are processing the value of the 
   * redirect URL, make sure that it is a URL on your site or a relative URL to avoid any security 
   * attacks like a phishing scheme. Otherwise, a third party can target your site's login page and 
   * then redirect back to their site and might have access to the user's secured session.
   *
   * The reason I don't use the session to store the URL, is that search engine spiders can end up 
   * creating sessions as they hit links on your site that are secured and require login. Since they 
   * have no credentials, the session is created only to timeout 30 minutes later.
   */
  if (!$this->_acl->isAllowed($role, $resource, $action)) {
   if (!$this->_auth->hasIdentity()) {
    $requestedUrl = substr($request->getRequestUri(), strlen($request->getBaseUrl())); // relative url 
    $loginUrl = $this->_noauthPath.'?requestedUrl='.urlencode($requestedUrl);
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    $redirector->gotoUrl($loginUrl);
   }
   else {
    $request->setModuleName($this->_noacl['module']);
    $request->setControllerName($this->_noacl['controller']);
    $request->setActionName($this->_noacl['action']);
   }
  }
 }
}