(в разработке: документация для версии 2.0)
Библиотека для обработки идентификации пользователя.
Цель этой библиотеки — найти учетную запись пользователя (точнее, ее уникальный идентификатор) для заданного подтверждения личности и управлять различными типами удостоверений. Состоит из 4 различных сервисов: Идентификация, Регистрация, Поиск и Восстановление.
Вы можете добавить библиотеку в свой проект с помощью композитора с помощью следующей команды:
composer require teresko/ palladium
Для использования этого пакета требуется PHP версии 7.0+ и PDO.
Вам также потребуется создать таблицу, в которой будут храниться идентификаторы . Пример схемы доступен здесь. В настоящее время она содержит только определение таблицы для MySQL/MariaDB, но библиотеку можно использовать с любой СУБД, имеющей драйвер PDO.
palladium содержит 4 сервиса: Registration
, Identification
, Search
и Recovery
. Каждая из этих служб имеет две обязательные зависимости:
palladium ContractCanPersistIdenity
)PsrLogLoggerInterface
)Это дает вам возможность заменить репозиторий по умолчанию, если вы хотите изменить или заменить части уровня абстракции персистентности. Что касается регистратора, рекомендуемый подход — использовать Monolog, но он будет работать с любой совместимой системой журналирования.
Репозиторий по умолчанию также имеет функциональные возможности для добавления пользовательских типов удостоверений и преобразователей данных, которые используются либо для ваших, либо для встроенных типов удостоверений. Подробности использования см. в разделе %TODO%.
В конструкторе службы Identification
есть необязательный третий и четвертый параметр:
В конструкторе службы Registration
есть необязательный третий параметр:
Как отмечалось выше, все 4 службы ожидают наличия репозитория в качестве зависимости конструктора. Если вы не заменяете встроенный репозиторий своей собственной версией, вам нужно будет инициализировать palladium RepositoryIdentity
и передать его службам.
Сам связанный репозиторий имеет одну зависимость: экземпляр, который реализует palladium ContractCanCreateMapper
. Этот контракт (интерфейс) реализуется palladium ComponentMapperFactory
. И у этой фабрики есть две зависимости: экземпляр PDO
и имя таблицы, в которой будут храниться идентификаторы .
<?php
$ factory = new palladium Component MapperFactory ( new PDO (... $ config ), $ tableName );
$ repository = new palladium Repository Identity ( $ factory );
В каждом другом примере кода, где вы видите использование переменной $repository
, вы можете предположить, что она была инициализирована с использованием этого примера кода.
Для пользователей компонента Symfony DependencyInjection (версия: 3.4+) существует пример файла конфигурации: %TODO%
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Если операция завершится успешно, переменная $identity
будет содержать экземпляр непроверенного StandardIdentity
. Для завершения проверки вам придется использовать токен, содержащийся в удостоверении. В данном примере этот токен можно оценить с помощью $instance->getToken()
.
Метод createStandardIdentity()
может выдать исключение IdentityConflict
, если электронная почта уже использовалась для другого удостоверения.
Метод createStandardIdentity()
имеет необязательный третий параметр, который определяет срок жизни токена проверки электронной почты в секундах. В применении предыдущий пример выглядит следующим образом:
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' , 3600 );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Это позволит использовать токен проверки в течение 1 часа после регистрации личности этого пользователя. По истечении заданного времени вы не сможете найти это удостоверение с помощью findStandardIdentityByToken()
в службе Search
.
ВАЖНО : методы
createStandardIdentity()
не проверяют электронную почту пользователя или любой другой тип идентификатора. Он только проверяет его уникальность. Проверка электронной почты, номеров телефонов, псевдонимов и других идентификаторов выходит за рамки этой библиотеки.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByToken ( $ token , palladium Entity Identity:: ACTION_VERIFY );
$ registration -> verifyStandardIdentity ( $ identity );
Значение $token
используется для поиска соответствующего EmailIdentity
, который затем проверяется. Если идентификатор не найден, метод findStandardIdentityByToken()
выдаст исключение IdentityNotFound
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ cookie = $ identification -> loginWithPassword ( $ identity , $ password );
Если не найдено соответствующего идентификатора с данным идентификатором (например, адресом электронной почты), метод findStandardIdentityByIdentifier()
выдаст исключение IdentityNotFound
.
В случае, если пароль не совпадает, метод loginWithPassword()
выдаст исключение PasswordMismatch
.
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId );
Это создаст новый экземпляр NonceIdentity
. Чтобы использовать его для входа в систему, вам потребуются значения в NonceIdentity::getIdentifier()
и NonceIdentity::getKey()
, где идентификатор будет использоваться для поиска идентификатора nonce, а ключ будет использоваться для проверки.
Метод createNonceIdentity()
был необязательным вторым параметром, который определял срок жизни этого одноразового удостоверения в секундах. В применении предыдущий пример выглядит следующим образом:
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId , 600 );
Это позволит использовать одноразовый идентификатор в течение 10 минут после его создания. По истечении разрешенного времени передача этого идентификатора в метод Identification
useNonceIdentity()
приведет к выдаче исключения IdentityExpired
.
<?php
$ identity = $ this -> search -> findNonceIdentityByIdentifier ( $ identifier );
$ cookie = $ this -> identification -> useNonceIdentity ( $ identity , $ key );
Если не найдено соответствующего идентификатора с данным идентификатором (адрес электронной почты, псевдоним и т. д.), метод findNonceIdentityByIdentifier()
выдаст исключение IdentityNotFound
.
В случае, если пароль не совпадает, метод useNonceIdentity()
выдаст исключение KeyMismatch
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ cookie = $ identification -> loginWithCookie ( $ identity , $ key );
Если файл cookie не найден с помощью findCookieIdentity()
будет выдано стандартное исключение IdentityNotFound
. Возможная причина этого может быть либо в том, что файл cookie больше не активен (например, пользователь вышел из системы), либо файл cookie вообще не существует.
В случае, если файл cookie слишком старый, loginWithCookie()
создаст исключение IdentityExpired
.
Но метод loginWithCookie()
также может создать исключение CompromisedCookie
. Наличие исключения для этого может указывать на то, что файл cookie был украден или что пользователь никогда не получал новое значение файла cookie.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> blockIdentity ( $ identity );
Это рекомендуемый способ борьбы с подозрительными файлами cookie, которые могут быть украдены, а могут и не быть украдены. Это не предназначено для выхода пользователей из системы .
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> logout ( $ identity , $ key );
Эта операция помечает файл cookie как «удаленный». Список исключений, которые могут быть созданы, соответствует тем, которые описаны в разделе входа в систему с использованием файлов cookie.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity );
Если не найдено соответствующего удостоверения с данным адресом электронной почты, метод findStandardIdentityByIdentifier()
выдаст исключение IdentityNotFound
.
При вызове markForReset()
ему должен быть предоставлен уже проверенный экземпляр StandardIdentity
(в противном случае существует вероятность утечки личной информации пользователя из вашего приложения). Если это не так, метод выдаст исключение IdentityNotVerified
.
Метод markForReset()
был необязательным вторым параметром, который определял срок жизни токена сброса пароля в секундах. В применении предыдущий пример выглядит следующим образом:
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity , 7200 );
Это позволит использовать токен сброса пароля в течение двух часов после того, как личность этого пользователя будет помечена для сброса. По истечении разрешенного времени вы не сможете найти это удостоверение с помощью findEmailIdentityByToken()
в службе Search
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findEmailIdentityByToken ( $ token , palladium Entity Identity:: ACTION_RESET );
$ recovery -> resetIdentityPassword ( $ identity , ' foobar ' );
Если не найдено соответствующего идентификатора с данным токеном, метод findEmailIdentityByToken()
выдаст исключение IdentityNotFound
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ identification -> changePassword ( $ identity , $ oldPassword , $ newPassword );
Если не найдено соответствующего идентификатора с данным адресом электронной почты (или идентификатором любого другого типа), метод findStandardIdentityByIdentifier()
выдаст исключение IdentityNotFound
.
В случае, если пароль не совпадает, метод changePassword()
выдаст исключение PasswordMismatch
.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ factory , $ logger );
$ list = $ search -> findIdentitiesByParentId ( $ identity -> getId ());
$ identification -> discardIdentityCollection ( $ list );
Возвращаемое значение findIdentitiesByParentId()
вернет IdentityCollection
, которое может быть пустым.
Как упоминалось ранее, службы в этой библиотеке ожидают наличия логгера, совместимого с PSR-3, в качестве зависимости. Он будет использоваться для регистрации событий трех уровней:
LogLevel::INFO
Этот уровень журнала используется для отслеживания обычных операций, которые пользователь будет выполнять при использовании вашего приложения по назначению:
LogLevel::NOTICE
Журналы этого уровня будут записываться, если пользователь предпримет неудачную операцию, чего не должно происходить при правильных сценариях использования:
LogLevel::WARNING
Используется только для регистрации случаев, когда пользователь пытался использовать взломанный файл cookie.
Эта библиотека ориентирована на одну конкретную задачу. Он не включает в себя следующие функции:
Если вы считаете, что для библиотеки аутентификации требуется одна из перечисленных выше частей, то это не та библиотека, которую вы ищете.