Http-аутентификация в php

Авторизация

Авторизация – это процесс подтверждения того, что пользователь, прошедший идентификацию/аутентифицикацию имеет права доступа к ресурсам, которые
он запрашивает. Если активный “ AuthComponent“ может автоматически проверить обработчики авторизации и гарантировать, что зарегистрированным
пользователям разрешен доступ к ресурсам, которые они запрашивают. Любые нужные коды php вы можете найти на специальном портале.

Настройка обработчиков авторизации

Вы настраиваете обработчики авторизации, используя ключ конфигурации authorize. Вы можете настроить один или несколько обработчиков для
авторизации. Использование нескольких обработчиков позволяет поддерживать различные способы проверки авторизации. Когда проверяются обработчики
авторизации, они будут вызваны в том порядке, в котором они объявлены. Обработчики должны возвращать false, если они не могут проверить
авторизацию, или если проверка не удалась. Обработчики должны возвращать true, если проверка авторизации прошла успешно. Обработчики будут
вызываться последовательно до тех пор, пока не найдется подходящий. Если все проверки закончатся неудачно, пользователь будет перенаправлен на
страницу, с которой он пришел. Кроме того, вы можете остановить все авторизации, выбросив исключение. Вам нужно будет перехватить любые
выброшенные исключения и обработать их.

Вы можете настроить обработчики авторизации в методе beforeFilter()или initialize() вашего контроллера. Вы можете передать информацию о
настройках каждого объекта авторизации, используя массив:

По аналогии с authenticate, authorize помогает вам соблюдать принцип DRY (не повторяйся), с помощью ключа all. Этот специальный
ключ позволяет вам назначать передаваемые параметры каждому прикрепленному объекту. Ключ all также можно представить в виде
статического свойства AuthComponent::ALL:

В примере, приведенном выше, как Actions так и Controller получат все настройки, объявленные для ключа „all“. Все настройки, переданные
конкретному объекту авторизации, переопределят значения соответствующих ключей, имеющихся внутри ключа „all“.

Похожее:  Авторизация ВК с помощью libcurl. Почему не отправляется форма? — Хабр Q&A

Если аутентифицированный пользователь пытается перейти к URL-адресу, к которому у него нет прав доступа, он перенаправляется обратно к
странице-источнику запроса. Если вы не хотите такого перенаправления (в основном, при использовании адаптера аутентификации без учета состояния),
вы можете установить параметр конфигурации unauthorizedRedirectв значение false. Это вынудит AuthComponent выбросить исключение
ForbiddenException вместо того, чтобы выполнить перенаправление.

Создание пользовательских объектов авторизации

Поскольку объекты авторизации подключаемы, вы можете создавать пользовательские объекты авторизации в своем приложении или плагинах.
Например, если вы хотите создать объект авторизации LDAP. В src/Auth/LdapAuthorize.php вы могли бы поместить следующий код:

Объекты авторизации должны возвращать false, если пользователю отказано в доступе, либо если объект не в состоянии произвести проверку полномочий.
Если же объект способен произвести проверку прав доступа пользователя, то в таком случае возвращается значение true. При этом вовсе не обязательно
наследоваться от BaseAuthorize, достаточно того, чтобы к вашему объекту авторизации был подключен метод authorize(). Класс BaseAuthorize
предоставляет множество полезных методов, которые часто используются.

Использование пользовательских объектов авторизации

Как только вы создали ваш объект авторизации, вы можете подключить его, передав его в массив authorize вашего компонента AuthComponent:

Отказ от использования авторизации

Если вы все же пожелали не использовать какой-либо из встроенных объектов авторизации, и захотели обрабатывать события за пределами AuthComponent,
в таком случае вы можете установить значение $this->Auth->config('authorize',false);. По умолчанию AuthComponent
использует для authorize значение false. Если вы не используете схему авторизации, убедитесь, что проверка авторизации производится либо
вручную внутри метода beforeFilter() вашего контроллера, либо с помощью какого-нибудь другого компонента.

Создание общедоступных экшенов

AuthComponent::allow($actions=null)

Часто у вас может возникать необходимость оставлять общедоступными некоторые экшены контроллера (не требующие авторизации).
AuthComponent пессимистичен и по умолчанию закрывает доступ. Вы можете пометить экшены как общедоступные с помощью метода
AuthComponent::allow(). AuthComponent не будет проверять авторизацию пользователей, обращающихся к таким экшенам, так же,
как не будет проверять объекты авторизации:

Вызывая метод без параметров, вы откроете доступ ко всем экшенам. Для уточнения отдельных экшенов, вы передаете их имена в виде строкового значения.
В противном случае передавайте в качестве параметра массив.

Создание экшенов требующих авторизации

AuthComponent::deny($actions=null)

По умолчанию все экшены требуют авторизации. И все же, если вы открыли доступ ко всем экшенам, и хотите обратить этот процесс, вы можете
воспользоваться методом AuthComponent::deny():

По аналогии с методом allow(), если не передается никаких параметров, то доступ закрыватся ко всем экшенам. Если передается строковое значение, то
доступ закрывается именно к указанному экшену. Для закрытия нескольких экшенов в метод передается массив

Аутентификация

Аутентификация – это процесс идентификации пользователей посредством учетных данных и обеспечение того, чтобы пользователи были теми, за кого они
себя выдают. Как правило, это делается с помощью имени пользователя и пароля, которые проверяются по списку известных пользователей. В CakePHP есть
несколько встроенных способов аутентификации пользователей, имеющихся у вашего приложения.

По умолчанию AuthComponent использует FormAuthenticate.

Выбор типа аутентификации

Как правило, вы захотите предложить аутентификацию на основе форм. Это самый простой способ для пользователей веб-браузеров. Если вы создаете API или веб-сервис, вы можете рассмотреть базовую аутентификацию или дайджест-аутентификацию. Основные различия между дайджест- и базовой аутентификацией в основном связаны с тем, как обрабатываются пароли.

При базовой аутентификации имя пользователя и пароль передаются в виде обычного текста на сервер. Это делает базовую аутентификацию
непригодной для приложений без SSL, так как вы будете подвергать пароли уязвимости. Дайджест-аутентификация передает в хэшированном виде имя пользователя, пароль и
некоторые другие детали. Это делает дайджест-аутентификацию более подходящей для приложений без SSL-шифрования.

Вы также можете использовать такие системы аутентификации, как например OpenID, но они уже не входят в состав ядра CakePHP.

Выход пользователей

AuthComponent::logout()

В конце концов вам понадобится быстрый способ разавторизовать кого-то и перенаправить их туда, куда нужно. Этот метод также полезен, если
вы хотите предоставить ссылку «Выйти из системы» внутри области вашего приложения для авторизованных пользователей:

Выход из приложения пользователей, вошедших в него с помощью Дайджест или Базовой аутентификации, трудно выполнить для всех клиентов.
Большинство браузеров сохраняют учетные данные на протяжении всего времени их работы. Некоторые клиенты могут быть принудительно выброшены
из приложения, отправкой кода состояния 401. Изменение области аутентификации – это еще одно возможное решение, которое работает для
некоторых клиентов.

Изменение алгоритмов хэширования

CakePHP предоставляет чистый способ переноса паролей пользователей с одного алгоритма на другой, это достигается с помощью класса FallbackPasswordHasher.
Предполагая, что вы переносите приложение с CakePHP 2.x, который использует хэши паролей sha1, вы можете настроить AuthComponent следующим образом:

Первое имя, появляющееся в ключе hashers, указывает, какой из классов является предпочтительным, но будет возвращаться к остальным в списке, если
проверка была неудачной.

При использовании WeakPasswordHasher`вамнужнобудетустановитьзначение“Security.salt, чтобы гарантировать надежность паролей засчет использования так называемой «соли».

Чтобы обновить пароли старых пользователей на лету, вы можете изменить функцию входа соответствующим образом:

Как вы можете заметить, мы просто устанавливаем простой пароль, так что функция-сеттер в сущности будет хешировать пароль, как показано в предыдущем
примере, а затем сохранит сущность (entity).

Настройка обработчиков авторизации

Вы настраиваете обработчики авторизации, используя ключ конфигурации authorize. Вы можете настроить один или несколько обработчиков для
авторизации. Использование нескольких обработчиков позволяет поддерживать различные способы проверки авторизации.

Когда проверяются обработчики авторизации, они будут вызваны в том порядке, в котором они объявлены.
Обработчики должны возвращать false, если они не могут проверить авторизацию, или если проверка не удалась.

Обработчики должны возвращать true, если проверка авторизации прошла успешно. Обработчики будут вызываться последовательно до тех пор, пока не найдется подходящий. Если
все проверки закончатся неудачно, пользователь будет перенаправлен на страницу, с которой он пришел.

Вы можете настроить обработчики авторизации в методе beforeFilter() или initialize() вашего контроллера. Вы можете передать информацию о настройках каждого объекта авторизации, используя массив:

По аналогии с authenticate, authorize помогает вам соблюдать принцип DRY (не повторяйся), с помощью ключа all.

Этот специальный ключ позволяет вам назначать передаваемые параметры каждому прикрепленному объекту. Ключ all также можно представить в виде
статического свойства AuthComponent::ALL:

В примере, приведенном выше, как Actions так и Controller получат все настройки, объявленные для ключа „all“.

Если аутентифицированный пользователь пытается перейти к URL-адресу, к которому у него нет прав доступа, он перенаправляется обратно к
странице-источнику запроса. Если вы не хотите такого перенаправления (в основном, при использовании адаптера аутентификации без учета состояния),
вы можете установить параметр конфигурации unauthorizedRedirect в значение false.

Это вынудит AuthComponent выбросить исключение ForbiddenException вместо того, чтобы выполнить перенаправление.

Настройка обработчиков аутентификации

Вы настраиваете обработчики аутентификации, используя конфигурацию authenticate. Вы можете настроить один или несколько обработчиков
для аутентификации. Использование нескольких обработчиков позволяет вам поддерживать разные способы входа пользователей.

Когда пользователи авторизуются, обработчики аутентификации проверяются в том порядке, в котором они были объявлены. Как только какой-либо обработчик сможет идентифицировать пользователя, все оставшиеся обработчики уже не будут использованы. И наоборот, вы можете прервать проверку подлинности,
выбросив исключение. Вам будет нужно перехватывать любые выбрасываемые исключения и обрабатывать их должным образом.

Обработка неаутентифицированных запросов

Когда пользователь, не прошедший проверку подлинности, пытается получить доступ к защищенным страницам, прежде всего вызывается метод unauthenticated()
последнего вызванного в цепочке аутентификатора.

Объект аутентификации может обрабатывать отправку ответа или перенаправление, возвращая объект ответа, чтобы указать, что никаких дополнительных действий не требуется. В связи с этим, порядок, в котором вы указываете провайдера аутентификации в параметре конфигурации authenticate, имеет значение.

Отказ от использования авторизации

Если вы все же пожелали не использовать какой-либо из встроенных объектов авторизации, и захотели обрабатывать события за пределами AuthComponent, в таком случае вы можете установить значение $this->Auth->config(‘authorize’,false);.

По умолчанию AuthComponent использует для authorize значение false.

Если вы не используете схему авторизации, убедитесь, что проверка авторизации производится либо вручную внутри метода beforeFilter() вашего контроллера, либо с помощью
какого-нибудь другого компонента.

Перенаправление пользователей после входа

AuthComponent::redirectUrl()

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

Если параметр не будет передан, возвращаемый URL будет подчиняться следующим правилам:

Создание кастомных объектов аутентификации

Поскольку объекты аутентификации являются подключаемыми, вы можете создавать собственные объекты аутентификации в своем приложении или плагинах.
Например, если вы хотите создать объект аутентификации OpenID.

Создание общедоступных экшенов

AuthComponent::allow($actions=null)

Часто у вас может возникать необходимость оставлять общедоступными некоторые экшены контроллера (не требующие авторизации).
AuthComponent пессимистичен и по умолчанию закрывает доступ.

Вы можете пометить экшены как общедоступные с помощью метода AuthComponent::allow(). AuthComponent не будет проверять
авторизацию пользователей, обращающихся к таким экшенам, так же, как не будет проверять объекты авторизации:

Вызывая метод без параметров, вы откроете доступ ко всем экшенам.
Для уточнения отдельных экшенов, вы передаете их имена в виде строкового значения.
В противном случае передавайте в качестве параметра массив.

Создание пользовательских классов хеширования паролей

Чтобы использовать другой хешер пароля, вам необходимо создать класс в src/Auth/LegacyPasswordHasher.php и реализовать методы hash() и check().

После чего вам необходимо настроить AuthComponent для использования вашего собственного хешера паролей:

Поддержка устаревших систем – хорошая идея, но еще лучше сохранить базу данных с последними достижениями в области безопасности. В следующем
разделе объясняется, как осуществить миграцию с одного алгоритма хеширования на алгоритм, используемый в CakePHP по умолчанию.

Создание пользовательских объектов авторизации

Поскольку объекты авторизации подключаемы, вы можете создавать пользовательские объекты авторизации в своем приложении или плагинах.
Например, если вы хотите создать объект авторизации LDAP.
В src/Auth/LdapAuthorize.php вы могли бы поместить следующий код:

Объекты авторизации должны возвращать false, если пользователю отказано в доступе, либо если объект не в состоянии произвести проверку полномочий.
Если же объект способен произвести проверку прав доступа пользователя, то в таком случае возвращается значение true.

При этом вовсе не обязательно наследоваться от BaseAuthorize, достаточно того, чтобы к вашему объекту авторизации был подключен метод authorize().

Использование пользовательских объектов авторизации

Как только вы создали ваш объект авторизации, вы можете подключить его, передав его в массив authorize вашего компонента AuthComponent:

Создание системы аутентификации без сохранения состояния

Базовая и Дайджест-аутентификация – это системы аутентификации не сохраняющие состояние, и не требующие исходных POST-данных или формы. Если вы используете
только эти два способа аутентификации, вашему котроллеру необязательно наличие экшена входа в систему (login).

Cистема аутентификации без сохранения состояния перепроверяет данные пользователя при каждом запросе. это создает небольшое количество дополнительных накладных расходов, но позволяет клиентам осуществлять вход без использования куки и делает AuthComponent более гибким при создании API.

Для аутентификаторов без сохранения состояния параметр конфигурации storage следует установить в Memory, чтобы AuthComponent не использовал сеccию
для хранения записи пользователя.

Вы также можете настроить параметр конфигурации unauthorizedRedirect в false, чтобы AuthComponent выбрасывал ForbiddenException вместо поведения по умолчанию – перенаправления на ссылающуюся страницу.

..note::
Параметр unauthorizedRedirect действует только для аутентифицированных пользователей. Для обработки неаутентифицированного доступа без перенаправления
вы должны загрузить вам понадобится загрузить один или несколько аутентификаторов без сохранения состояния, таких как Базовый или Дайджест. В противном случае ваш
запрос будет перенаправлен на loginAction.

Создание экшенов требующих авторизации

AuthComponent::deny($actions=null)

По умолчанию все экшены требуют авторизации. И все же, если вы открыли доступ ко всем экшенам, и хотите обратить этот процесс, вы можете воспользоваться методом AuthComponent::deny():

По аналогии с методом allow(), если не передается никаких параметров, то доступ закрыватся ко всем экшенам. Если передается строковое значение, то
доступ закрывается именно к указанному экшену. Для закрытия нескольких экшенов в метод передается массив

Хеширование паролей для дайджест-аутентификации

Поскольку для Дайджест-аутентификации требуется пароль, хэшированный в формате, определенном RFC, для правильного хэширования пароля
для использования с Дайджест-аутентификацией вам следует использовать специальную функцию хэширования пароля из DigestAuthenticate.

Пароли для дайджест-аутентификации нуждаются в несколько большем количестве информации, чем другие хеши паролей для дайджест-аутентификации, основанные
на RFC.

Вывод флэш-сообщений компонента auth

Чтобы отображать сообщения об ошибках сессии, генерируемые Auth, вам нужно добавить следующий код в свой макет (layout).

Вы можете настроить сообщения об ошибках и параметры флэш-сообщений, используемые AuthComponent. Используя параметр конфигурации flash, вы
можете настроить параметры, используемые AuthComponent для установки флэш-сообщений. Доступные ключи:

В дополнение к настройкам флэш-сообщений, вы можете настраивать также и другие сообщения об ошибках, используемые в AuthComponent. В методе
beforeFilter() или в настройках компонента вы можете использовать authError для кастомизации ошибок использующихся при неудачной
авторизации:

Иногда вы хотите отобразить ошибку авторизации только после того, как пользователь уже выполнил вход в систему. Вы можете подавить это сообщение,
установив его значение в булево false.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *