Лучшие практики Zend_Auth

Моя цель – потребовать логин для определенных страниц. Я использую Zend Framework MVC, и я пытаюсь найти примеры, касающиеся лучших практик.

Некоторые заметки о том, что я ищу:

  • Я хочу, чтобы пользователи, не входящие в систему, получили окно входа в систему, а затем вернулись к зарегистрированной версии страницы,
  • Я хочу использовать инъекцию зависимостей и избегать одиночных
  • Небольшой размер кода – связать структуру Zend mvc
  • Должен ли ящик входа быть отдельным контроллером и перенаправить заголовок заголовка? Как вернуться на целевую страницу после успешного успеха? Идея просто вызвать действие контроллера входа, чтобы отобразить окно входа в целевую страницу, или это недостаток, связанный с индексацией поисковых систем?
  • Уметь использовать внешнюю библиотеку для обработки файлов cookie

Или что-то совсем другое. Я довольно новичок в структуре Zend, и я хочу сделать это «правильным путем».

Solutions Collecting From Web of "Лучшие практики Zend_Auth"

  • Я хочу, чтобы пользователи, не входящие в систему, получили окно входа в систему, а затем вернулись к зарегистрированной версии страницы,

Используйте плагин FrontController и перенаправляйте или пересылайте их в loginAction.

  • Я хочу использовать инъекцию зависимостей и избегать одиночных

Zend Framework, в настоящее время не отправляет никаких систем DI, однако Zend_Application_Resource_ * фактически заменит его. Какая зависимость вам понадобится?

  • Небольшой размер кода – связать структуру Zend mvc

Это зависит от вас.

  • Должен ли ящик входа быть отдельным контроллером и перенаправить заголовок заголовка? Как вернуться на целевую страницу после успешного успеха? Идея просто вызвать действие контроллера входа, чтобы отобразить окно входа в целевую страницу, или это недостаток, связанный с индексацией поисковых систем?

В основном я использую специальный AuthController с LoginAction & LogoutAction . Для перенаправления пользователя на страницу пыталась просмотреть, я всегда добавляю элемент returnUrl в своих формах, и я добавляю значение запрашиваемого URL-адреса, чтобы иметь возможность перенаправлять пользователя, а если нет, я перенаправляю его на индекс / dashboard, зависит.

  • Уметь использовать внешнюю библиотеку для обработки файлов cookie

Zend_Auth позволяет вам установить собственный механизм хранения , поэтому просто реализуйте интерфейс.

 $auth = Zend_Auth::getInstance(); $auth->setStorage(new My_Auth_Storage()); 

Но никогда не сохраняйте результат аутентификации в файле cookie, поэтому его легко изменить и получить доступ к вашему веб-сайту.

Вы также можете взглянуть на один из моих предыдущих ответов .

Вы можете использовать комбинацию Zend_Auth и Zend_Acl . Чтобы расширить другие ответы, я приведу краткий пример того, как вы можете управлять аутентификацией с помощью zend framework:

Сначала вам нужно настроить плагин для предварительной отправки всех запросов и проверить, разрешен ли клиенту доступ к определенным данным. Этот плагин может выглядеть следующим образом:

 class Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract { private $_acl = null; public function __construct(Zend_Acl $acl) { $this->_acl = $acl; } public function preDispatch(Zend_Controller_Request_Abstract $request) { //get request information $module = $request->getModuleName (); $resource = $request->getControllerName (); $action = $request->getActionName (); try { if(!$this->_acl->isAllowed(Zend_Registry::get('role'), $module . ':' . $resource, $action)){ $request->setControllerName ('authentication') ->setActionName ('login'); } }catch(Zend_Acl_Exception $e) { $request->setControllerName('index')->setActionName ('uups'); } } } 

Поэтому каждый пользовательский тип имеет определенные разрешения, которые вы определяете в своей acl-библиотеке. По каждому запросу вы проверяете, разрешен ли пользователю доступ к ресурсу. Если вы не переадресовываете страницу входа, иначе preDispatch передает пользователю ресурс.

В Zend_Acl вы определяете роли, ресурсы и разрешение, разрешающие или запрещающие доступ, например:

 class Model_LibraryAcl extends Zend_Acl { public function __construct() { $this->addRole(new Zend_Acl_Role('guests')); $this->addRole(new Zend_Acl_Role('users'), 'guests'); $this->addRole(new Zend_Acl_Role('admins'), 'users'); $this->add(new Zend_Acl_Resource('default')) ->add(new Zend_Acl_Resource('default:authentication'), 'default') ->add(new Zend_Acl_Resource('default:index'), 'default') ->add(new Zend_Acl_Resource('default:error'), 'default'); $this->allow('guests', 'default:authentication', array('login')); $this->allow('guests', 'default:error', 'error'); $this->allow('users', 'default:authentication', 'logout'); } } 

Затем вам нужно настроить acl и auth в файле начальной загрузки:

  private $_acl = null; protected function _initAutoload() { //...your code if (Zend_Auth::getInstance()->hasIdentity()){ Zend_Registry::set ('role', Zend_Auth::getInstance()->getStorage() ->read() ->role); }else{ Zend_Registry::set('role', 'guests'); } $this->_acl = new Model_LibraryAcl (); $fc = Zend_Controller_Front::getInstance (); $fc->registerPlugin ( new Plugin_AccessCheck ( $this->_acl ) ); return $modelLoader; } 

Наконец, в вашем контроллере проверки подлинности вы должны использовать настраиваемый адаптер аутентификации и настроить действия для входа и выхода из системы:

 public function logoutAction() { Zend_Auth::getInstance ()->clearIdentity (); $this->_redirect ( 'index/index' ); } private function getAuthAdapter() { $authAdapter = new Zend_Auth_Adapter_DbTable ( Zend_Db_Table::getDefaultAdapter ()); $authAdapter->setTableName('users') ->setIdentityColumn('email') ->setCredentialColumn ('password') ->setCredentialTreatment ('SHA1(CONCAT(?,salt))'); return $authAdapter; } 

В вашем действии для входа вам необходимо передать данные входа в адаптер auth, который выполняет аутентификацию.

 $authAdapter = $this->getAuthAdapter (); $authAdapter->setIdentity ( $username )->setCredential ( $password ); $auth = Zend_Auth::getInstance (); $result = $auth->authenticate ( $authAdapter ); if ($result->isValid ()) { $identity = $authAdapter->getResultRowObject (); if ($identity->approved == 'true') { $authStorage = $auth->getStorage (); $authStorage->write ( $identity ); $this->_redirect ( 'index/index' ); } else { $this->_redirect ( 'authentication/login' ); } 

И это все. Я рекомендую вам это КАК на youtube на zend auth и zend acl.

Не уверен, что это лучшая практика, но если я буду реализовывать то, что вы после этого, я бы сделал следующее:

  1. Создайте LoginForm с уникально идентифицируемой кнопкой отправки (поясняется ниже)
  2. Создайте AuthService с помощью методов getLoginForm , login , logout и одного или всех из них: getIdentity , hasIdentity и аналогичных методов.
  3. Создайте средство просмотра, в котором есть экземпляр этой службы, и в зависимости от того, что является результатом hasIdentity , либо визуализируйте LoginForm, либо отобразите идентификатор зарегистрированного пользователя в представлениях, которые нуждаются в этой функции.
  4. Создайте плагин переднего контроллера, который также имеет экземпляр службы и реализует preDispatch плагина preDispatch . Дайте ему некоторую конфигурацию действий для зондирования. Если AuthService->hasIdentity() возвращает true, ничего не делайте. Если запрос является почтовым запросом, найдите уникально идентифицируемое имя кнопки отправки, то есть: $request->getPost( 'loginSubmitButton', null ); по умолчанию значение null если оно недоступно. Если не null выполните login( $request->getPost() ) в службе. В случае успеха перенаправляйтесь к одному и тому же действию, если неудачно провалиться и снова отобразите форму в средстве просмотра (автоматически отображая ошибки).

Служба может быть получена как с помощью viewhelper, так и с помощью плагина переднего контроллера с некоторым локатором службы, выполняющим что-то вроде ServiceAbstract::getService( 'Auth' ) , зарегистрировав службу в ServiceAbstract в бутстрапе.