ВведениеZend_Auth предоставляет API для аутентификации и включает в себя конкретные адаптеры для общих случаев применения. Задачей Zend_Auth является аутентификация, но не авторизация. Аутентификацию в общих чертах можно характеризовать как процесс определения, действительно ли сущность является тем, чем она претендует быть (то есть идентификация), на основании некоторого набора учетных данных. Авторизация же - процесс определения того, можно ли предоставить сущности доступ или разрешить выполнить действие, и это полностью вне сферы компетенции Zend_Auth. Дополнительную информацию об авторизации и контроле доступа в Zend Framework смотрите в Zend_Acl.
АдаптерыАдаптер Zend_Auth используется дла аутентификации посредством определенного сервиса, такого как LDAP, СУРБД или файлового хранилища. Адаптеры могут значительно различаться, но некоторые основные черты характерны для всех. Например, все адаптеры Zend_Auth принимают учетные данные, выполненяют запрос к аутентификационному сервису и возвращают результат. Каждый адаптер Zend_Auth реализует Zend_Auth_Adapter_Interface. Этот интерфейс определяет лишь один метод: authenticate(), который должен быть реализовать для выполнения аутентификационного запроса. Адаптер должен быть настроен до вызова authenticate(), настройка включает в себя установку учетных данных(например, логин и пароль) и определение специфичных значений, таких как настройки подключения к базе данных для адаптера таблиц БД. Это пример адаптера, требующего установки логина и пароля для аутентификации. Прочие детали, например каким образом аутентификационный сервис запрашивается, были опущены для кратости:
Как указано в докблоке, authenticate() должен вернуть экземпляр Zend_Auth_Result (или унаследованный от него). Если по какой либо причине выполнение аутентификации невозможно, authenticate() должен бросить исключение, происходящее от Zend_Auth_Adapter_Exception. Результат аутентификацииМетод authenticate() адаптера Zend_Auth возвращает экзмепляр Zend_Auth_Result для представления результата попытки аутентификации. Объект Zend_Auth_Result заполняется адаптером при создании, и следующие четыре метода представляют его базовый набор операций:
Разработчик может пожелать выполнять различные действия на основании результата аутентификации. Например, он может найти полезным блокировку аккаунтов после нескольких вводов неправильного пароля, пометку IP после слишком многих попыток аутентификации с несуществующими данными или вывод настраиваемых сообщений о результате аутентификации. Существуют следующие коды результата: Этот пример показывает, как разработчик может различным образом обработать результат аутентификации, используя значение кода:
Постоянное хранение идентификатора пользователяАутентификация запроса, содержащего учетные данные, важна сама по себе, но также важно поддерживать сохранение идентификатора без необходимости передачи учетных данных с каждым запросом. Протокол HTTP не имеет состояний, однако были разработаны такие технологии как куки(cookies) и сессии для поддержки состояния на стороне сервера между несколькими запросами к веб приложению. Сохранение идентификатора в сессии PHP, по умолчаниюПо умолчанию, Zend_Auth обеспечивает постоянное хранение идентификатора полученного в результате успешной попытки аутентификации в PHP сессии. При успешной попытке, Zend_Auth::authenticate() сохраняет идентификатор в постоянном хранилище. Если не настроено по другому, Zend_Auth использует класс хранилища Zend_Auth_Storage_Session, который в свою очередь использует Zend_Session. Вместо него может быть использован пользовательский класс, для этого нужно передать Zend_Auth::setStorage() объект, реализующий Zend_Auth_Storage_Interface.
Example #1 Изменение пространства имен в сессии Zend_Auth_Storage_Session использует пространство имен 'Zend_Auth'. Оно может быть переопределено передачей другого значения конструктору Zend_Auth_Storage_Session, которое будет дальше передано конструктору Zend_Session_Namespace. Это нужно сделать до того, как будет произведена попытка аутентификации, так как Zend_Auth::authenticate() выполняет автоматическое сохранение идентификатора.
Реализация пользовательского хранилищаИногда разработчику может понадобиться использовать иной механизм хранения идентификаторов, нежели предоставляется в Zend_Auth_Storage_Session. В том случае он может реализовать Zend_Auth_Storage_Interface и передать экземпляр методу Zend_Auth::setStorage(). Example #2 Использование пользовательского хранилища Для того, чтобы использовать иной класс хранилища пользовательских идентификаторов, нежели Zend_Auth_Storage_Session, разработчик реализует Zend_Auth_Storage_Interface:
Для использования этого класса, Zend_Auth::setStorage() вызывается до выполнения попытки авторизации:
ИспользованиеСуществует два пути использования адаптеров Zend_Auth:
Следующий пример показывает, как использовать адаптер Zend_Auth через класс Zend_Auth:
После того как попытка аутентификации была произведена, как показано в примере выше, теперь нужно только проверить, существует ли аутентифицированный идентификатор:
Для удаления идентификатора из постоянного хранилища, просто используйте метод clearIdentity(). Обычно это используется для реализации действия "Выйти": Когда автоматическое использование постоянного хранилища не подходит, разработчик может просто обойти Zend_Auth и использовать класс адаптера напрямую. Прямое использование адаптера включает в себя настройку, подготовку объекта адаптера и последующий вызов его метода, authenticate(). Специфичные для адаптера детали обсуждаются в документации этого адаптера. Следующий пример напрямую использует MyAuthAdapter:
|