Аутентификация для PHP. Простой, легкий и безопасный.
Написано один раз, чтобы использоваться повсюду.
Полностью независимый от фреймворка и базы данных.
pdo
)mysqlnd
) , драйвер PostgreSQL ( pgsql
) или драйвер SQLite ( sqlite
)openssl
)Подключите библиотеку через Composer [?]:
$ composer require delight-im/auth
Включите автозагрузчик Composer:
require __DIR__ . ' /vendor/autoload.php ' ;
Настройте базу данных и создайте необходимые таблицы:
Переходите с более ранней версии этого проекта? Дополнительную информацию см. в нашем руководстве по обновлению.
// $ db = new PDO ( ' mysql:dbname=my-database ; host = localhost ; charset = utf8mb4' , ' my-username' , ' my-password' ) ;
// or
// $ db = new PDO ( ' pgsql:dbname=my-database ; host = localhost ; port = 5432 ' , ' my-username' , ' my-password' ) ;
// or
// $ db = new PDO ( ' sqlite:../Databases/my-database.sqlite' ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' mysql:dbname=my-database ; host = localhost ; charset = utf8mb4' , ' my-username' , ' my-password' ) ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' pgsql:dbname=my-database ; host = localhost ; port = 5432 ' , ' my-username' , ' my-password' ) ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' sqlite:../Databases/my-database.sqlite' ) ) ;
$ auth = new Delight Auth Auth ( $ db );
Если у вас уже есть открытое соединение PDO
, просто используйте его повторно. Пользователю базы данных (например, my-username
) необходимы как минимум привилегии SELECT
, INSERT
, UPDATE
и DELETE
для таблиц, используемых этой библиотекой (или их родительской базой данных).
Если ваш веб-сервер находится за прокси-сервером и $_SERVER['REMOTE_ADDR']
содержит только IP-адрес прокси-сервера, вы должны передать реальный IP-адрес пользователя конструктору во втором аргументе, который называется $ipAddress
. По умолчанию используется обычный удаленный IP-адрес, полученный PHP.
Если вашим таблицам базы данных для этой библиотеки нужен общий префикс, например, my_users
вместо users
(и аналогично для других таблиц), передайте префикс (например, my_
) в качестве третьего параметра конструктору, который называется $dbTablePrefix
. Это необязательно, и по умолчанию префикс пуст.
Во время разработки вы можете захотеть отключить ограничение или регулирование запросов, выполняемое этой библиотекой. Для этого передайте конструктору false
в качестве четвертого аргумента, который называется $throttling
. Эта функция включена по умолчанию.
Во время существования сеанса некоторые пользовательские данные могут быть изменены удаленно либо клиентом в другом сеансе, либо администратором. Это означает, что эта информация должна регулярно повторно синхронизироваться с ее авторитетным источником в базе данных, что эта библиотека делает автоматически. По умолчанию это происходит каждые пять минут. Если вы хотите изменить этот интервал, передайте конструктору собственный интервал в секундах в качестве пятого аргумента с именем $sessionResyncInterval
.
Если всем таблицам вашей базы данных требуется общее имя базы данных, имя схемы или другой квалификатор, который должен быть указан явно, вы можете передать этот квалификатор конструктору в качестве шестого параметра с именем $dbSchema
.
Если вы также хотите использовать экземпляр PdoDatabase
(например, $db
) независимо, обратитесь к документации библиотеки базы данных.
try {
$ userId = $ auth -> register ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ _POST [ ' username ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' We have signed up a new user with the ID ' . $ userId ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' User already exists ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Примечание. Анонимная функция обратного вызова является замыканием. Таким образом, помимо собственных параметров, внутри доступны только суперглобальные переменные, такие как $_GET
, $_POST
, $_COOKIE
и $_SERVER
. Для любой другой переменной из родительской области необходимо явно сделать копию доступной внутри, добавив предложение use
после списка параметров.
Имя пользователя в третьем параметре не является обязательным. Вы можете передать здесь null
если не хотите управлять именами пользователей.
С другой стороны, если вы хотите обеспечить уникальность имен пользователей, просто вызовите registerWithUniqueUsername
вместо register
и будьте готовы перехватить исключение DuplicateUsernameException
.
Примечание. При принятии и управлении именами пользователей вы можете исключить непечатаемые управляющие символы и некоторые печатаемые специальные символы, как в классе символов [x00-x1fx7f/:\]
. Для этого вы можете обернуть вызов Auth#register
или Auth#registerWithUniqueUsername
внутри условной ветки, например, принимая имена пользователей только при выполнении следующего условия:
if ( preg_match ( ' /[x00-x1fx7f/: \\ ]/ ' , $ username ) === 0 ) {
// ...
}
Для проверки электронной почты вам следует создать URL-адрес с селектором и токеном и отправить его пользователю, например:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Если вы не хотите выполнять проверку электронной почты, просто опустите последний параметр в Auth#register
, то есть анонимную функцию или замыкание. Тогда новый пользователь будет активен немедленно.
Необходимо сохранить дополнительную информацию о пользователе? Читайте здесь.
Примечание. Отправляя электронное письмо пользователю, обратите внимание, что (необязательное) имя пользователя на данный момент еще не подтверждено как приемлемое для владельца (нового) адреса электронной почты. Он может содержать оскорбительные или вводящие в заблуждение выражения, выбранные кем-то, кто на самом деле не является владельцем адреса.
try {
$ auth -> login ( $ _POST [ ' email ' ], $ _POST [ ' password ' ]);
echo ' User is logged in ' ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Wrong email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Wrong password ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email not verified ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
С другой стороны, если вы хотите войти в систему с именами пользователей, либо в дополнение к входу через адрес электронной почты, либо в качестве замены, это также возможно. Просто вызовите метод loginWithUsername
вместо метода login
. Затем вместо перехвата InvalidEmailException
обязательно перехватите UnknownUsernameException
и AmbiguousUsernameException
. Вы также можете прочитать примечания об уникальности имен пользователей в разделе, объясняющем, как регистрировать новых пользователей.
Извлеките селектор и токен из URL-адреса, на который пользователь нажал в письме с подтверждением.
try {
$ auth -> confirmEmail ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ]);
echo ' Email address has been verified ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' Email address already exists ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Если вы хотите, чтобы пользователь автоматически входил в систему после успешного подтверждения, просто вызовите confirmEmailAndSignIn
вместо confirmEmail
. Этот альтернативный метод также поддерживает постоянный вход в систему через необязательный третий параметр.
В случае успеха оба метода confirmEmail
и confirmEmailAndSignIn
возвращают массив с новым адресом электронной почты пользователя, который только что был проверен, с индексом один. Если подтверждение было связано с изменением адреса, а не с простой проверкой адреса, старый адрес электронной почты пользователя будет включен в массив с нулевым индексом.
Третий параметр методов Auth#login
и Auth#confirmEmailAndSignIn
определяет, будет ли вход в систему постоянным с помощью долгоживущего файла cookie. При таком постоянном входе пользователи могут оставаться аутентифицированными в течение длительного времени, даже если сеанс браузера уже закрыт и срок действия файлов cookie сеанса истек. Обычно вам нужно, чтобы пользователь оставался в системе в течение нескольких недель или месяцев с помощью этой функции, которая известна как «запомнить меня» или «оставить меня в системе». Многим пользователям это покажется более удобным, но это может быть менее безопасно, если они оставят свои устройства без присмотра.
if ( $ _POST [ ' remember ' ] == 1 ) {
// keep logged in for one year
$ rememberDuration = ( int ) ( 60 * 60 * 24 * 365.25 );
}
else {
// do not keep logged in after session ends
$ rememberDuration = null ;
}
// ...
$ auth -> login ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ rememberDuration );
// . . .
Без постоянного входа в систему, который является поведением по умолчанию , пользователь будет оставаться в системе только до тех пор, пока не закроет свой браузер, или до тех пор, пока это настроено через session.cookie_lifetime
и session.gc_maxlifetime
в PHP.
Опустите третий параметр или установите для него значение null
чтобы отключить эту функцию. В противном случае вы можете спросить пользователя, хотят ли они включить «запомнить меня». Обычно это делается с помощью флажка в пользовательском интерфейсе. Используйте входные данные из этого флажка, чтобы выбрать между null
и заранее определенной продолжительностью в секундах, например 60 * 60 * 24 * 365.25
в течение одного года.
try {
$ auth -> forgotPassword ( $ _POST [ ' email ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' Request has been generated ' ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email not verified ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Примечание. Анонимная функция обратного вызова является замыканием. Таким образом, помимо собственных параметров, внутри доступны только суперглобальные переменные, такие как $_GET
, $_POST
, $_COOKIE
и $_SERVER
. Для любой другой переменной из родительской области необходимо явно сделать копию доступной внутри, добавив предложение use
после списка параметров.
Вам следует создать URL-адрес с селектором и токеном и отправить его пользователю, например:
$ url = ' https://www.example.com/reset_password?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Если срок действия запросов на сброс пароля по умолчанию вам не подходит, вы можете использовать третий параметр Auth#forgotPassword
, чтобы указать настраиваемый интервал в секундах, по истечении которого запросы должны истечь.
Следующим шагом пользователи нажмут на полученную ссылку. Извлеките селектор и токен из URL-адреса.
Если пара селектор/токен действительна, позвольте пользователю выбрать новый пароль:
try {
$ auth -> canResetPasswordOrThrow ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ]);
echo ' Put the selector into a "hidden" field (or keep it in the URL) ' ;
echo ' Put the token into a "hidden" field (or keep it in the URL) ' ;
echo ' Ask the user for their new password ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
В качестве альтернативы, если вам не нужны сообщения об ошибках, а вы хотите только проверить достоверность, вы можете использовать немного более простую версию:
if ( $ auth -> canResetPassword ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ])) {
echo ' Put the selector into a "hidden" field (or keep it in the URL) ' ;
echo ' Put the token into a "hidden" field (or keep it in the URL) ' ;
echo ' Ask the user for their new password ' ;
}
Теперь, когда у вас есть новый пароль для пользователя (и еще две части информации), вы можете сбросить пароль:
try {
$ auth -> resetPassword ( $ _POST [ ' selector ' ], $ _POST [ ' token ' ], $ _POST [ ' password ' ]);
echo ' Password has been reset ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Хотите ли вы, чтобы соответствующий пользователь автоматически входил в систему после успешного сброса пароля? Просто используйте Auth#resetPasswordAndSignIn
вместо Auth#resetPassword
чтобы немедленно войти в систему.
Если вам нужен идентификатор или адрес электронной почты пользователя, например, для отправки ему уведомления об успешном сбросе пароля, просто используйте возвращаемое значение Auth#resetPassword
, которое представляет собой массив, содержащий две записи с именами id
и email
.
Если пользователь в настоящее время вошел в систему, он может изменить свой пароль.
try {
$ auth -> changePassword ( $ _POST [ ' oldPassword ' ], $ _POST [ ' newPassword ' ]);
echo ' Password has been changed ' ;
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password(s) ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Рекомендуемый способ изменения пароля — запросить у пользователя текущий (а вскоре и старый ) пароль и запросить его для проверки. Это показано выше.
Однако, если вы уверены, что вам не нужно это подтверждение, вы можете вызвать changePasswordWithoutOldPassword
вместо changePassword
и удалить первый параметр из этого вызова метода (который в противном случае содержал бы старый пароль).
В любом случае после изменения пароля пользователя вам следует отправить электронное письмо на основной адрес электронной почты его учетной записи в виде внешнего уведомления, информирующего владельца учетной записи об этом критическом изменении.
Если пользователь в настоящее время вошел в систему, он может изменить свой адрес электронной почты.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
$ auth -> changeEmail ( $ _POST [ ' newEmail ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email to the *new* address) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The change will take effect as soon as the new email address has been confirmed ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' Email address already exists ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Account not verified ' );
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Примечание. Анонимная функция обратного вызова является замыканием. Таким образом, помимо собственных параметров, внутри доступны только суперглобальные переменные, такие как $_GET
, $_POST
, $_COOKIE
и $_SERVER
. Для любой другой переменной из родительской области необходимо явно сделать копию доступной внутри, добавив предложение use
после списка параметров.
Для проверки электронной почты вам следует создать URL-адрес с селектором и токеном и отправить его пользователю, например:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Примечание. Отправляя электронное письмо пользователю, обратите внимание, что (необязательное) имя пользователя на данный момент еще не подтверждено как приемлемое для владельца (нового) адреса электронной почты. Он может содержать оскорбительные или вводящие в заблуждение выражения, выбранные кем-то, кто на самом деле не является владельцем адреса.
После того, как был сделан запрос на изменение адреса электронной почты или, что еще лучше, после того, как изменение было подтверждено пользователем, вам следует отправить электронное письмо на предыдущий адрес электронной почты его учетной записи в виде внешнего уведомления, информирующего владельца учетной записи о это критическое изменение.
Примечание. Изменения адреса электронной почты пользователя вступают в силу в локальном сеансе немедленно, как и ожидалось. Однако в других сеансах (например, на других устройствах) изменениям может потребоваться до пяти минут, чтобы они вступили в силу. Это повышает производительность и обычно не вызывает проблем. Тем не менее, если вы хотите изменить это поведение, просто уменьшите (или, возможно, увеличьте) значение, которое вы передаете конструктору Auth
в качестве аргумента с именем $sessionResyncInterval
.
Если более ранний запрос на подтверждение не удалось доставить пользователю, или если пользователь пропустил этот запрос, или он просто не хочет больше ждать, вы можете повторно отправить более ранний запрос следующим образом:
try {
$ auth -> resendConfirmationForEmail ( $ _POST [ ' email ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The user may now respond to the confirmation request (usually by clicking a link) ' ;
}
catch ( Delight Auth ConfirmationRequestNotFound $ e ) {
die ( ' No earlier request found that could be re-sent ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' There have been too many requests -- try again later ' );
}
Если вы хотите указать пользователя по его идентификатору, а не по адресу электронной почты, это также возможно:
try {
$ auth -> resendConfirmationForUserId ( $ _POST [ ' userId ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The user may now respond to the confirmation request (usually by clicking a link) ' ;
}
catch ( Delight Auth ConfirmationRequestNotFound $ e ) {
die ( ' No earlier request found that could be re-sent ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' There have been too many requests -- try again later ' );
}
Примечание. Анонимная функция обратного вызова является замыканием. Таким образом, помимо собственных параметров, внутри доступны только суперглобальные переменные, такие как $_GET
, $_POST
, $_COOKIE
и $_SERVER
. Для любой другой переменной из родительской области необходимо явно сделать копию доступной внутри, добавив предложение use
после списка параметров.
Обычно вам следует создать URL-адрес с селектором и токеном и отправить его пользователю, например, следующим образом:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Примечание. Отправляя электронное письмо пользователю, обратите внимание, что (необязательное) имя пользователя на данный момент еще не подтверждено как приемлемое для владельца (нового) адреса электронной почты. Он может содержать оскорбительные или вводящие в заблуждение выражения, выбранные кем-то, кто на самом деле не является владельцем адреса.
$ auth -> logOut ();
// or
try {
$ auth -> logOutEverywhereElse ();
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
// or
try {
$ auth -> logOutEverywhere ();
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
Кроме того, если вы также храните пользовательскую информацию в сеансе и хотите, чтобы эта информация была удалена, вы можете уничтожить весь сеанс, вызвав второй метод:
$ auth -> destroySession ();
Примечание. Глобальные выходы из системы вступают в силу в локальном сеансе немедленно, как и ожидалось. Однако в других сеансах (например, на других устройствах) изменениям может потребоваться до пяти минут, чтобы они вступили в силу. Это повышает производительность и обычно не вызывает проблем. Тем не менее, если вы хотите изменить это поведение, просто уменьшите (или, возможно, увеличьте) значение, которое вы передаете конструктору Auth
в качестве аргумента с именем $sessionResyncInterval
.
if ( $ auth -> isLoggedIn ()) {
echo ' User is signed in ' ;
}
else {
echo ' User is not signed in yet ' ;
}
Сокращение/псевдоним этого метода — $auth->check()
.
$ id = $ auth -> getUserId ();
Если пользователь в данный момент не вошел в систему, возвращается null
.
Сокращение/псевдоним этого метода — $auth->id()
.
$ email = $ auth -> getEmail ();
Если пользователь в данный момент не вошел в систему, возвращается null
.
$ username = $ auth -> getUsername ();
Помните, что имена пользователей не являются обязательными, и существует только имя пользователя, если вы указали его при регистрации.
Если пользователь в данный момент не вошел в систему, возвращается null
.
if ( $ auth -> isNormal ()) {
echo ' User is in default state ' ;
}
if ( $ auth -> isArchived ()) {
echo ' User has been archived ' ;
}
if ( $ auth -> isBanned ()) {
echo ' User has been banned ' ;
}
if ( $ auth -> isLocked ()) {
echo ' User has been locked ' ;
}
if ( $ auth -> isPendingReview ()) {
echo ' User is pending review ' ;
}
if ( $ auth -> isSuspended ()) {
echo ' User has been suspended ' ;
}
if ( $ auth -> isRemembered ()) {
echo ' User did not sign in but was logged in through their long-lived cookie ' ;
}
else {
echo ' User signed in manually ' ;
}
Если пользователь в данный момент не вошел в систему, возвращается null
.
$ ip = $ auth -> getIpAddress ();
Чтобы сохранить пригодность этой библиотеки для всех целей, а также возможность ее полного повторного использования, в нее не включены дополнительные столбцы для информации пользователя. Но без дополнительной пользовательской информации, конечно, не обойтись:
Вот как использовать эту библиотеку с вашими собственными таблицами для хранения пользовательской информации удобным для обслуживания и повторного использования способом:
Добавьте любое количество пользовательских таблиц базы данных, в которых вы храните пользовательскую информацию, например таблицу с именем profiles
.
Всякий раз, когда вы вызываете метод register
(который возвращает идентификатор нового пользователя), впоследствии добавьте свою собственную логику, которая заполнит ваши пользовательские таблицы базы данных.
Если пользовательская информация нужна вам редко, вы можете просто получить ее по мере необходимости. Однако если вам это нужно чаще, вы, вероятно, захотите включить его в данные сеанса. Следующий метод позволяет надежно загрузить данные и получить к ним доступ:
function getUserInfo ( Delight Auth Auth $ auth ) {
if (! $ auth -> isLoggedIn ()) {
return null ;
}
if (! isset ( $ _SESSION [ ' _internal_user_info ' ])) {
// TODO : load your custom user information and assign it to the session variable below
// $ _SESSION [ ' _internal_user_info' ] = ...
}
return $ _SESSION [ ' _internal_user_info ' ];
}
Всякий раз, когда вы захотите еще раз подтвердить личность пользователя, например, прежде чем пользователю будет разрешено выполнить какое-либо «опасное» действие, вам следует еще раз проверить его пароль, чтобы подтвердить, что он действительно тот, за кого себя выдает.
Например, когда пользователь запомнился долгоживущим файлом cookie и, таким образом Auth#isRemembered
возвращает true
, это означает, что пользователь, вероятно, уже довольно давно не вводил свой пароль. В этом случае вы можете подтвердить свой пароль.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
echo ' The user really seems to be who they claim to be ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' The user is not signed in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Каждый пользователь может иметь любое количество ролей, которые вы можете использовать для реализации авторизации и уточнения контроля доступа.
Пользователи могут вообще не иметь роли (которая у них есть по умолчанию), иметь только одну роль или любую произвольную комбинацию ролей.
if ( $ auth -> hasRole ( Delight Auth Role:: SUPER_MODERATOR )) {
echo ' The user is a super moderator ' ;
}
// or
if ( $ auth -> hasAnyRole ( Delight Auth Role:: DEVELOPER , Delight Auth Role:: MANAGER )) {
echo ' The user is either a developer, or a manager, or both ' ;
}
// or
if ( $ auth -> hasAllRoles ( Delight Auth Role:: DEVELOPER , Delight Auth Role:: MANAGER )) {
echo ' The user is both a developer and a manager ' ;
}
Хотя метод hasRole
принимает в качестве аргумента ровно одну роль, два метода hasAnyRole
и hasAllRoles
могут принимать любое количество ролей, которые вы хотите проверить.
Альтернативно вы можете получить список всех ролей, назначенных пользователю:
$ auth -> getRoles ();
Delight Auth Role:: ADMIN ;
Delight Auth Role:: AUTHOR ;
Delight Auth Role:: COLLABORATOR ;
Delight Auth Role:: CONSULTANT ;
Delight Auth Role:: CONSUMER ;
Delight Auth Role:: CONTRIBUTOR ;
Delight Auth Role:: COORDINATOR ;
Delight Auth Role:: CREATOR ;
Delight Auth Role:: DEVELOPER ;
Delight Auth Role:: DIRECTOR ;
Delight Auth Role:: EDITOR ;
Delight Auth Role:: EMPLOYEE ;
Delight Auth Role:: MAINTAINER ;
Delight Auth Role:: MANAGER ;
Delight Auth Role:: MODERATOR ;
Delight Auth Role:: PUBLISHER ;
Delight Auth Role:: REVIEWER ;
Delight Auth Role:: SUBSCRIBER ;
Delight Auth Role:: SUPER_ADMIN ;
Delight Auth Role:: SUPER_EDITOR ;
Delight Auth Role:: SUPER_MODERATOR ;
Delight Auth Role:: TRANSLATOR ;
Вы можете использовать любую из этих ролей и игнорировать те, которые вам не нужны. Приведенный выше список также можно получить программно в одном из трех форматов:
Delight Auth Role:: getMap ();
// or
Delight Auth Role:: getNames ();
// or
Delight Auth Role:: getValues ();
Разрешения каждого пользователя закодированы таким же образом, как и требования к ролям, указанные в вашей кодовой базе. Если эти требования оцениваются с использованием набора ролей конкретного пользователя, результатом являются неявно проверяемые разрешения.
Для более крупных проектов часто рекомендуется хранить определения разрешений в одном месте. В этом случае вы не проверяете роли в своей бизнес-логике, а проверяете отдельные разрешения . Вы можете реализовать эту концепцию следующим образом:
function canEditArticle ( Delight Auth Auth $ auth ) {
return $ auth -> hasAnyRole (
Delight Auth Role:: MODERATOR ,
Delight Auth Role:: SUPER_MODERATOR ,
Delight Auth Role:: ADMIN ,
Delight Auth Role:: SUPER_ADMIN
);
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' The user can edit articles here ' ;
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' ... and here ' ;
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' ... and here ' ;
}
Как видите, разрешение на то, может ли определенный пользователь редактировать статью, хранится в центральном месте. Эта реализация имеет два основных преимущества:
Если вы хотите знать, какие пользователи могут редактировать статьи, вам не нужно проверять свою бизнес-логику в разных местах, а достаточно посмотреть, где определено конкретное разрешение. И если вы хотите изменить тех, кто может редактировать статью, вам нужно сделать это только в одном месте, а не по всей базе кода.
Но это также сопряжено с немного большими накладными расходами при первой реализации ограничений доступа, что может стоить, а может и не стоить того для вашего проекта.
Если имена включенных ролей вам не подходят, вы можете назначить любое количество ролей, используя свои собственные идентификаторы, например так:
namespace My Namespace ;
final class MyRole {
const CUSTOMER_SERVICE_AGENT = Delight Auth Role:: REVIEWER ;
const FINANCIAL_DIRECTOR = Delight Auth Role:: COORDINATOR ;
private function __construct () {}
}
Приведенный выше пример позволит вам использовать
My Namespace MyRole:: CUSTOMER_SERVICE_AGENT ;
// and
My Namespace MyRole:: FINANCIAL_DIRECTOR ;
вместо
Delight Auth Role:: REVIEWER ;
// and
Delight Auth Role:: COORDINATOR ;
Просто помните, что не следует использовать одну включенную роль в качестве псевдонима для нескольких ролей с произвольными именами.
Хотя сброс пароля по электронной почте — это удобная функция, которую большинство пользователей время от времени находят полезной, доступность этой функции означает, что учетные записи в вашем сервисе всегда настолько безопасны, насколько безопасна связанная с ними учетная запись электронной почты.
Вы можете предоставить заботящимся о безопасности (и опытным) пользователям возможность отключить сброс паролей для их учетных записей (и снова включить их позже) для повышения безопасности:
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
$ auth -> setPasswordResetEnabled ( $ _POST [ ' enabled ' ] == 1 );
echo ' The setting has been changed ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' The user is not signed in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Чтобы проверить текущее значение этого параметра, используйте возвращаемое значение из
$ auth -> isPasswordResetEnabled ();
для правильной опции по умолчанию в вашем пользовательском интерфейсе. Вам не нужно проверять это значение, поскольку ограничения функции применяются автоматически.
Все методы, предоставляемые этой библиотекой, автоматически защищены от чрезмерного количества запросов от клиентов. Если возникнет необходимость, вы можете (временно) отключить эту защиту с помощью переданного в конструктор параметра $throttling
.
Если вы хотите также регулировать или ограничивать скорость внешних функций или методов, например, в вашем собственном коде, вы можете использовать встроенный вспомогательный метод для регулирования и ограничения скорости:
try {
// throttle the specified resource or feature to * 3 * requests per * 60 * seconds
$ auth -> throttle ([ ' my-resource-name ' ], 3 , 60 );
echo ' Do something with the resource or feature ' ;
}
catch ( Delight Auth TooManyRequestsException $ e ) {
// operation cancelled
http_response_code ( 429 );
exit ;
}
Если защита ресурса или функции должна дополнительно зависеть от другого атрибута, например, отслеживать что-то отдельно для каждого IP-адреса, просто добавьте дополнительные данные в описание ресурса, например:
[ ' my-resource-name ' , $ _SERVER [ ' REMOTE_ADDR ' ] ]
// instead of
// [ ' my-resource-name' ]
Разрешить короткие всплески активности во время пиковой нагрузки можно, указав коэффициент всплеска в качестве четвертого аргумента. Например, значение 5
допускает временные всплески пятикратной активности по сравнению с общепринятым уровнем.
В некоторых случаях вам может потребоваться просто смоделировать регулирование или ограничение скорости. Это позволяет вам проверить, разрешено ли действие, без фактического изменения трекера активности. Для этого просто передайте true
в качестве пятого аргумента.
Примечание. Когда вы отключаете регулирование на экземпляре (с помощью параметра $throttling
переданного конструктору), это отключает как автоматическую внутреннюю защиту, так и эффект любых вызовов Auth#throttle
в вашем собственном коде приложения – если вы также не установили параметр Необязательный параметр $force
имеет значение true
в определенных вызовах Auth#throttle
.
Административный интерфейс доступен через $auth->admin()
. Вы можете вызывать различные методы в этом интерфейсе, как описано ниже.
Не забудьте реализовать безопасный контроль доступа, прежде чем предоставлять доступ к этому интерфейсу. Например, вы можете предоставить доступ к этому интерфейсу только вошедшим в систему пользователям с ролью администратора или использовать интерфейс только в частных сценариях.
try {
$ userId = $ auth -> admin ()-> createUser ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ _POST [ ' username ' ]);
echo ' We have signed up a new user with the ID ' . $ userId ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' User already exists ' );
}
Имя пользователя в третьем параметре не является обязательным. Вы можете передать здесь null
если не хотите управлять именами пользователей.
С другой стороны, если вы хотите обеспечить уникальность имен пользователей, просто вызовите createUserWithUniqueUsername
вместо createUser
и будьте готовы перехватить исключение DuplicateUsernameException
.
Удаление пользователей по ID:
try {
$ auth -> admin ()-> deleteUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
Удаление пользователей по адресу электронной почты:
try {
$ auth -> admin ()-> deleteUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
Удаление пользователей по имени пользователя:
try {
$ auth -> admin ()-> deleteUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
При получении списка всех пользователей требования сильно различаются в зависимости от проекта и варианта использования, а настройка является обычным явлением. Например, вы можете захотеть получить разные столбцы, объединить связанные таблицы, отфильтровать по определенным критериям, изменить способ сортировки результатов (в разном направлении) и ограничить количество результатов (с указанием смещения).
Вот почему проще использовать один собственный SQL-запрос. Начните со следующего:
SELECT id, email, username, status, verified, roles_mask, registered, last_login FROM users;
try {
$ auth -> admin ()-> addRoleForUserById ( $ userId , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
// or
try {
$ auth -> admin ()-> addRoleForUserByEmail ( $ userEmail , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
// or
try {
$ auth -> admin ()-> addRoleForUserByUsername ( $ username , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
Примечание. Для вступления в силу изменений в наборе ролей пользователя может потребоваться до пяти минут. Это повышает производительность и обычно не вызывает проблем. Тем не менее, если вы хотите изменить это поведение, просто уменьшите (или, возможно, увеличьте) значение, которое вы передаете конструктору Auth
в качестве аргумента с именем $sessionResyncInterval
.
try {
$ auth -> admin ()-> removeRoleForUserById ( $ userId , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
// or
try {
$ auth -> admin ()-> removeRoleForUserByEmail ( $ userEmail , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
// or
try {
$ auth -> admin ()-> removeRoleForUserByUsername ( $ username , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
Примечание. Для вступления в силу изменений в наборе ролей пользователя может потребоваться до пяти минут. Это повышает производительность и обычно не вызывает проблем. Тем не менее, если вы хотите изменить это поведение, просто уменьшите (или, возможно, увеличьте) значение, которое вы передаете конструктору Auth
в качестве аргумента с именем $sessionResyncInterval
.
try {
if ( $ auth -> admin ()-> doesUserHaveRole ( $ userId , Delight Auth Role:: ADMIN )) {
echo ' The specified user is an administrator ' ;
}
else {
echo ' The specified user is not an administrator ' ;
}
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
Альтернативно вы можете получить список всех ролей, назначенных пользователю:
$ auth -> admin ()-> getRolesForUserById ( $ userId );
try {
$ auth -> admin ()-> logInAsUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
// or
try {
$ auth -> admin ()-> logInAsUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
// or
try {
$ auth -> admin ()-> logInAsUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
try {
$ auth -> admin ()-> changePasswordForUserById ( $ _POST [ ' id ' ], $ _POST [ ' newPassword ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
// or
try {
$ auth -> admin ()-> changePasswordForUserByUsername ( $ _POST [ ' username ' ], $ _POST [ ' newPassword ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
Эта библиотека использует два файла cookie для хранения состояния клиента: первый, имя которого вы можете получить с помощью
session_name ();
— это общий (обязательный) файл cookie сеанса. Второй (необязательный) файл cookie используется только для постоянного входа в систему, и его имя можно получить следующим образом:
Delight Auth Auth:: createRememberCookieName ();
Вы можете переименовать файл cookie сеанса, используемый этой библиотекой, одним из следующих способов в порядке рекомендации:
В конфигурации PHP ( php.ini
) найдите строку с директивой session.name
и измените ее значение на что-то вроде session_v1
, например:
session.name = session_v1
Как можно раньше в вашем приложении и перед созданием экземпляра Auth
вызовите ini_set
, чтобы изменить session.name
на что-то вроде session_v1
, например:
ini_set ( ' session.name ' , ' session_v1 ' );
Чтобы это работало, для session.auto_start
должно быть установлено значение 0
в конфигурации PHP ( php.ini
).
Как можно раньше в приложении и до создания экземпляра Auth
вызовите session_name
с аргументом типа session_v1
, например:
session_name ( ' session_v1 ' );
Чтобы это работало, для session.auto_start
должно быть установлено значение 0
в конфигурации PHP ( php.ini
).
Имя файла cookie для постоянного входа в систему также изменится (автоматически) после изменения имени сеансового файла cookie.
Атрибут domain
файла cookie определяет, для какого домена (и поддоменов) файл cookie будет действителен и, следовательно, где будет доступен сеанс пользователя и состояние аутентификации.
Рекомендуемым значением по умолчанию является пустая строка. Это означает, что файл cookie будет действителен только для конкретного текущего хоста, исключая любые существующие поддомены. Вам следует использовать другое значение только в том случае, если вам нужно использовать файлы cookie между разными поддоменами. Часто вам может понадобиться использовать файлы cookie между пустым доменом и поддоменом www
, но вы также можете захотеть разделить их между любым другим набором поддоменов.
Какой бы набор субдоменов вы ни выбрали, вам следует установить атрибут файла cookie на наиболее конкретное доменное имя, которое по-прежнему включает все необходимые вам субдомены. Например, чтобы обмениваться файлами cookie между example.com
и www.example.com
, вам следует установить атрибут example.com
. Но если вы хотите использовать файлы cookie между sub1.app.example.com
и sub2.app.example.com
, вам следует установить атрибут app.example.com
. Любое явно указанное доменное имя всегда будет включать все возможные поддомены.
Вы можете изменить атрибут одним из следующих способов в порядке рекомендации:
В конфигурации PHP ( php.ini
) найдите строку с директивой session.cookie_domain
и измените ее значение по желанию, например:
session.cookie_domain = example.com
Как можно раньше в вашем приложении и перед созданием экземпляра Auth
вызовите ini_set
чтобы изменить значение директивы session.cookie_domain
по желанию, например:
ini_set ( ' session.cookie_domain ' , ' example.com ' );
Чтобы это работало, для session.auto_start
в конфигурации PHP ( php.ini
) должно быть установлено значение 0
.
Атрибут path
файла cookie определяет, для каких каталогов (и подкаталогов) файл cookie будет действителен и, следовательно, где будет доступен сеанс пользователя и состояние аутентификации.
В большинстве случаев вам потребуется сделать файлы cookie доступными для всех путей, т. е. для любого каталога и файла, начиная с корневого каталога. Именно это делает значение /
для атрибута, которое также является рекомендуемым значением по умолчанию. Вам следует изменить этот атрибут на другое значение, например, /path/to/subfolder
, только если вы хотите ограничить каталоги, в которых будут доступны ваши файлы cookie, например, для одновременного размещения нескольких приложений в разных каталогах в соответствии с то же доменное имя.
Вы можете изменить атрибут одним из следующих способов в порядке рекомендации:
В конфигурации PHP ( php.ini
) найдите строку с директивой session.cookie_path
и измените ее значение по желанию, например:
session.cookie_path = /
Как можно раньше в вашем приложении и перед созданием экземпляра Auth
вызовите ini_set
чтобы изменить значение директивы session.cookie_path
по желанию, например:
ini_set ( ' session.cookie_path ' , ' / ' );
Чтобы это работало, для session.auto_start
в конфигурации PHP ( php.ini
) должно быть установлено значение 0
.
Используя атрибут httponly
, вы можете контролировать, должны ли клиентские сценарии, например JavaScript, иметь доступ к вашим файлам cookie или нет. По соображениям безопасности лучше всего запретить скриптам доступ к вашим файлам cookie, что снижает ущерб, который могут нанести, например, успешные XSS-атаки на ваше приложение.
Таким образом, вам всегда следует устанавливать httponly
равным 1
, за исключением редких случаев, когда вам действительно нужен доступ к вашим файлам cookie из JavaScript и вы не можете найти лучшего решения. В таких случаях установите для атрибута значение 0
, но помните о последствиях.
Вы можете изменить атрибут одним из следующих способов в порядке рекомендации:
В конфигурации PHP ( php.ini
) найдите строку с директивой session.cookie_httponly
и измените ее значение по желанию, например:
session.cookie_httponly = 1
Как можно раньше в вашем приложении и перед созданием экземпляра Auth
вызовите ini_set
чтобы изменить значение директивы session.cookie_httponly
по желанию, например:
ini_set ( ' session.cookie_httponly ' , 1 );
Чтобы это работало, для session.auto_start
должно быть установлено значение 0
в конфигурации PHP ( php.ini
).
Используя атрибут secure
, вы можете контролировать, должны ли файлы cookie отправляться по любому соединению, включая обычный HTTP, или должно ли требоваться безопасное соединение, то есть HTTPS (с SSL/TLS). Первый (менее безопасный) режим можно выбрать, установив для атрибута значение 0
, а второй (более безопасный) режим можно выбрать, установив для атрибута значение 1
.
Очевидно, это зависит исключительно от того, можете ли вы обслуживать все страницы исключительно через HTTPS. Если возможно, вам следует установить для атрибута значение 1
и, возможно, объединить его с перенаправлением HTTP на безопасный протокол и строгую транспортную безопасность HTTP (HSTS). В противном случае вам, возможно, придется оставить атрибут равным 0
.
Вы можете изменить атрибут одним из следующих способов в порядке рекомендации:
В конфигурации PHP ( php.ini
) найдите строку с директивой session.cookie_secure
и измените ее значение по желанию, например:
session.cookie_secure = 1
Как можно раньше в вашем приложении и перед созданием экземпляра Auth
вызовите ini_set
чтобы изменить значение директивы session.cookie_secure
по желанию, например:
ini_set ( ' session.cookie_secure ' , 1 );
Чтобы это работало, для session.auto_start
должно быть установлено значение 0
в конфигурации PHP ( php.ini
).
$ length = 24 ;
$ randomStr = Delight Auth Auth:: createRandomString ( $ length );
$ uuid = Delight Auth Auth:: createUuid ();
Подробную информацию о том, как удобно читать и записывать данные сеанса, можно найти в документации библиотеки сеансов, которая включена по умолчанию.
Любой пароль или токен аутентификации автоматически хешируется с помощью функции «bcrypt», которая основана на шифре «Blowfish» и (до сих пор) считается одной из самых надежных функций хеширования паролей на сегодняшний день. «bcrypt» используется с 1024 итерациями, то есть коэффициент «стоимости» равен 10. Случайная «соль» также применяется автоматически.
Вы можете проверить эту конфигурацию, просмотрев хеши в таблице users
вашей базы данных. Если вышеизложенное верно для вашей настройки, все хэши паролей в вашей таблице users
должны начинаться с префикса $2$10$
, $2a$10$
или $2y$10$
.
Когда в будущем могут быть представлены новые алгоритмы (например, Argon2), эта библиотека автоматически позаботится об «обновлении» существующих хэшей паролей всякий раз, когда пользователь входит в систему или меняет свой пароль.
Обычно хорошей идеей является обеспечение минимальной длины паролей. Кроме того, вы можете проверить, находится ли потенциальный пароль в каком-либо черном списке, которым вы можете управлять в базе данных или в файле, чтобы предотвратить использование слов из словаря или часто используемых паролей в вашем приложении.
Чтобы обеспечить максимальную гибкость и простоту использования, эта библиотека была разработана таким образом, чтобы она сама не содержала никаких дополнительных проверок требований к паролю, а вместо этого позволяла вам выполнять собственные проверки вокруг соответствующих вызовов методов библиотеки. Пример:
function isPasswordAllowed ( $ password ) {
if ( strlen ( $ password ) < 8 ) {
return false ;
}
$ blacklist = [ ' password1 ' , ' 123456 ' , ' qwerty ' ];
if ( in_array ( $ password , $ blacklist )) {
return false ;
}
return true ;
}
if ( isPasswordAllowed ( $ password )) {
$ auth -> register ( $ email , $ password );
}
Вы можете попробовать сначала загрузить эту библиотеку и сначала создать экземпляр Auth
, прежде чем загружать другие библиотеки. Кроме этого, мы, вероятно, мало что можем здесь сделать.
Если вы хотите, чтобы другие могли включать ваш сайт в элемент <frame>
, <iframe>
, <object>
, <embed>
или <applet>
, вам необходимо отключить функцию предотвращения кликджекинга по умолчанию:
header_remove ( ' X-Frame-Options ' );
Эта библиотека генерирует два типа исключений, указывающих на проблемы:
AuthException
и его подклассы создаются всякий раз, когда метод не завершается успешно. Вы всегда должны перехватывать эти исключения, поскольку они несут обычные ответы об ошибках, на которые вы должны реагировать.AuthError
и его подклассы выдаются всякий раз, когда возникает внутренняя проблема или библиотека установлена неправильно. Вы не должны ловить эти исключения. Все вклады приветствуются! Если вы хотите внести свой вклад, сначала создайте проблему, чтобы обсудить вашу функцию, проблему или вопрос.
Этот проект лицензирован в соответствии с условиями лицензии MIT.