Нужен полный пример аутентификации / авторизации / контроля доступа в Zend Framework 1.9 - PullRequest
2 голосов
/ 03 декабря 2009

У меня запущено несколько приложений Zend Framework, и пришло время добавить ограничения на доступ пользователей. Я твердо убежден в том, что вам следует стараться по возможности избегать развертывания собственной инфраструктуры безопасности, поэтому я пытался выяснить, как использовать Zend_Auth и Zend_Acl для ее реализации, пока безуспешно.

Я искал по всей сети и, по крайней мере, одну книгу, и я не могу найти пример того, как связать все части вместе. Я нашел пример аутентификации здесь , старые примеры авторизации / контроля доступа здесь и здесь и предложения на будущее здесь , здесь и здесь , но я недостаточно хорошо понимаю ZF, чтобы сложить все вместе в настоящем.

Что мне нужно, так это: простой общедоступный пример или учебное пособие, в котором полностью подробно [в виде загружаемого и запускаемого кода] подробно описано, как использовать текущий выпуск Zend Framework (1.9.5, без «предложений» или «лабораторий») для управления аутентификация / авторизация / контроль доступа трех пользователей (и их паролей) в трех разных ролях (например, гость, участник, администратор) для защиты трех разных контроллеров в модуле по умолчанию. Пример должен использовать как можно большую часть текущей библиотеки ZF. И нет, это не домашняя работа; ставки выше этого: - (

Если он где-то существует, я его не нашел. Любая помощь приветствуется. ИМО, это было бы очень полезно для новичков в ZF.

Раскрытие: у меня есть вики-вопрос сообщества по ZF здесь , потому что я пытаюсь выяснить, буду ли я продолжать с ним. Но мне действительно нужно, чтобы мои приложения работали сейчас!

1 Ответ

1 голос
/ 09 декабря 2009

Pro Zend Framework Techniques , глава 8 хорошо описывает это. Большая часть его подхода очень похожа на то, что я использую, за исключением метода preDispatch. При аутентификации у меня есть перенаправление preDispatch вместо тихой отправки на другой контроллер. Я также сохраняю URL, который был запрошен для использования действия входа в систему.

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']);
   }
  }
 }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...