Моя цель – потребовать логин для определенных страниц. Я использую Zend Framework MVC, и я пытаюсь найти примеры, касающиеся лучших практик.
Некоторые заметки о том, что я ищу:
Или что-то совсем другое. Я довольно новичок в структуре Zend, и я хочу сделать это «правильным путем».
- Я хочу, чтобы пользователи, не входящие в систему, получили окно входа в систему, а затем вернулись к зарегистрированной версии страницы,
Используйте плагин 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.
Не уверен, что это лучшая практика, но если я буду реализовывать то, что вы после этого, я бы сделал следующее:
LoginForm
с уникально идентифицируемой кнопкой отправки (поясняется ниже) AuthService
с помощью методов getLoginForm
, login
, logout
и одного или всех из них: getIdentity
, hasIdentity
и аналогичных методов. hasIdentity
, либо визуализируйте LoginForm, либо отобразите идентификатор зарегистрированного пользователя в представлениях, которые нуждаются в этой функции. preDispatch
плагина preDispatch
. Дайте ему некоторую конфигурацию действий для зондирования. Если AuthService->hasIdentity()
возвращает true, ничего не делайте. Если запрос является почтовым запросом, найдите уникально идентифицируемое имя кнопки отправки, то есть: $request->getPost( 'loginSubmitButton', null );
по умолчанию значение null
если оно недоступно. Если не null
выполните login( $request->getPost() )
в службе. В случае успеха перенаправляйтесь к одному и тому же действию, если неудачно провалиться и снова отобразите форму в средстве просмотра (автоматически отображая ошибки). Служба может быть получена как с помощью viewhelper, так и с помощью плагина переднего контроллера с некоторым локатором службы, выполняющим что-то вроде ServiceAbstract::getService( 'Auth' )
, зарегистрировав службу в ServiceAbstract
в бутстрапе.