{"id":13805493,"url":"https://github.com/sinbadxiii/phalcon-auth","last_synced_at":"2025-12-25T13:08:15.419Z","repository":{"id":56772470,"uuid":"346650556","full_name":"sinbadxiii/phalcon-auth","owner":"sinbadxiii","description":"Phalcon Auth - Authentication based guards and providers adapters","archived":false,"fork":false,"pushed_at":"2024-10-31T11:48:12.000Z","size":239,"stargazers_count":8,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-31T12:23:18.600Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sinbadxiii.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-03-11T09:40:14.000Z","updated_at":"2024-10-31T11:17:43.000Z","dependencies_parsed_at":"2024-01-03T02:24:49.985Z","dependency_job_id":"5942ebcd-9cd2-4427-9c9a-7d13b8618c35","html_url":"https://github.com/sinbadxiii/phalcon-auth","commit_stats":{"total_commits":64,"total_committers":1,"mean_commits":64.0,"dds":0.0,"last_synced_commit":"0f51a1228952c5a342bd274a17f3a1cd8eb2838d"},"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinbadxiii%2Fphalcon-auth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinbadxiii%2Fphalcon-auth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinbadxiii%2Fphalcon-auth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinbadxiii%2Fphalcon-auth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sinbadxiii","download_url":"https://codeload.github.com/sinbadxiii/phalcon-auth/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225254340,"owners_count":17445166,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T01:01:01.694Z","updated_at":"2025-12-25T13:08:15.355Z","avatar_url":"https://github.com/sinbadxiii.png","language":"PHP","funding_links":[],"categories":["Authentication \u0026 OAuth"],"sub_categories":[],"readme":"# Phalcon Auth\n\n![Banner](https://github.com/sinbadxiii/images/blob/master/phalcon-auth/phalcon-auth-logo.png?raw=true)\n\nYou can see an example of an application with authentication here [sinbadxiii/phalcon-auth-example](https://github.com/sinbadxiii/phalcon-auth-example)\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-brightgreen?style=flat-square\" alt=\"Software License\"\u003e\u003c/img\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/sinbadxiii/phalcon-auth\"\u003e\u003cimg src=\"https://img.shields.io/packagist/dt/sinbadxiii/phalcon-auth?style=flat-square\" alt=\"Packagist Downloads\"\u003e\u003c/img\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/sinbadxiii/phalcon-auth/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/release/sinbadxiii/phalcon-auth?style=flat-square\" alt=\"Latest Version\"\u003e\u003c/img\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Extended guards\n* [JWT Guard](https://github.com/sinbadxiii/phalcon-auth-jwt)\n\n## Phalcon version\n\n\u003e Unfortunately version 2 of the library no longer supports Phalcon 4.\n\n| Phalcon 3   | Phalcon 4     | Phalcon 5     | Phalcon 6\n :-------------| :-------------| :-------------| :----------\n| :x:         | :x:| :heavy_check_mark: | :question:\n\n## PHP are supported\n\n^7.4-8.1.\n\n## Install\n\nRequire the project using composer:\n\n`composer require \"sinbadxiii/phalcon-auth:^v2.0.0\"`\n\n## Introduction\n\n![Banner](https://github.com/sinbadxiii/images/blob/master/phalcon-auth/auth-scheme.webp?raw=true)\n\nPhalcon Auth позволит вам создать систему аутентификации в вашем веб-приложении.\n\nСистема аутентификации имеет такие понятия как «Охранники» (Guard) и «Поставщики» (Provider), охранники определяют, как пользователи будут аутентифицироваться, например, используя стандартные Хранилища Сессии и файлов куки.\n\nПровайдеры определяют, какие данные будут браться в качестве пользователей, и так же откуда будут извлекаться эти пользователи. Откуда будут извлекаться данные пользователей определяют Адаптеры (Adapter). Обычно это `Phalcon\\Mvc\\Model` и построитель запросов к базе данных.\n\nКроме того есть другие варианты адаптеров: файл или массив с данными. Можно создать свой адаптер, реализуя интерфейс адаптера. Об этом поговорим чуть позже. \n\n\u003e Guards и Providers не следует путать с «roles» и «permissions» [ACL](https://docs.phalcon.io/4.0/en/acl). Auth и ACL  следует использовать вместе, если требуется более точная надстройка доступа к узлам приложения. Например использовать роль `manager` со специфическими правами.\n\n## Быстрый старт\n\nПолностью пример готового приложения с аутентификацией доступен по адресу [sinbadxiii/phalcon-auth-example](https://github.com/sinbadxiii/phalcon-auth-example). Это типовой проект на Phalcon, который можно использовать как старт нового приложения, либо же просто ознакомиться с возможностями аутентификации на примере данного приложения.  \n\n## Логика работы\n\nОбщий принцип работы аутентификации заключается в том, что пользователь вводит свое имя пользователя и пароль через форму входа. Если эти учетные данные верны, приложение сохранит информацию об аутентифицированном пользователе в сессии пользователя и будет считать пользователя \"аутентифицированным\". В случае использования \"Запомнить меня\" может быть создан файл cookie, который содержит идентификатор сессии, чтобы последующие запросы к приложению могли быть связаны с нужным пользователем. После получения идентификатора сессии из файла cookie приложение извлечет данные пользователя.\n\nВозьмем другой случай, когда удаленному сервису необходимо пройти аутентификацию для доступа к API, обычно файлы cookie не используются для аутентификации, поскольку веб-браузер отсутствует. Вместо этого удаленная служба отправляет токен API при каждом запросе. Приложение может проверить входящий токен по таблице действительных токенов API и \"аутентифицировать\" запрос как выполненный пользователем, связанным с этим токеном API.\n\n## Подготовка базы данных\n \nДля использования данных из бд, понадобится создать таблицу `users`.\n\nЕсли необходимо будет использовать функцию \"Запомнить меня\" - `RememberMe`, которая позволяет хранить сеанс аутентификации пользователя длительное время, то так же понадобится таблица `users_remember_tokens`, ну и соответственно ее модель в виде `App\\Models\\RememberToken`.\n\nДля быстрого создания таблиц вы можете импортировать файлы из папки `db/users.sql`, `db/users_remember_tokens.sql`, а так же `db/create_auth_token_users.sql`, если будете использовать в качестве Guard - Token, которому необходимо поле `auth_token` для корректной работы.\n\n## Managers\n\nПри создании аутентификации вы можете воспользоваться одним из двух менеджеров: `Sinbadxiii\\PhalconAuth\\Manager` или `Sinbadxiii\\PhalconAuth\\ManagerFactory`.\n\n## Manager\n\nЕсли вы строго придерживаетесь философии фреймворка Phalcon и хотите вручную настроить все компоненты аутентификации, то вам понадобится класс `Sinbadxiii\\PhalconAuth\\Manager` - с помощью данного менеджера можно настроить охранника, адаптер поставщиков и распределить доступы пользователям.  \n\n```php\nuse Sinbadxiii\\PhalconAuth\\Manager;\nuse App\\Models\\User;\nuse Sinbadxiii\\PhalconAuth\\Adapter\\Model;\nuse Sinbadxiii\\PhalconAuth\\Guard\\Session;\n\n$auth = new Manager();\n\n$configAdapter = [\n    'model' =\u003e User::class,\n];\n\n$adapter = new Model($this-\u003egetSecurity(), $configAdapter);\n$guard   = new Session(\n    $adapter,\n    $this-\u003egetSession(),\n    $this-\u003egetCookies(),\n    $this-\u003egetRequest(),\n    $this-\u003egetEventsManager()\n);\n\n$auth-\u003eaddGuard(\"web\", $guard, true);\n\nreturn $auth;\n```\n\nВ результате получился менеджер, который будет искать пользователей через модель `User` в таблице базе данных `users`.\nРезультат аутентификации будет храниться в сессии, и куках, если выбрать \"Запомнить меня\".\nВ качестве других аргументов нужно передать сервис провайдеры `$this-\u003esecurity`, `$this-\u003esession`, `$this-\u003ecookies`, `$this-\u003erequest`, `$this-\u003eeventsManager`, которые будут необходимы при дальнейшем использовании охранника и адаптера поставщиков.\n\n- public \u003cb\u003eaddGuard\u003c/b\u003e(string $nameGuard, GuardInterface $guard, bool $isDefault = false) - добавить охранника\n- public \u003cb\u003eguard\u003c/b\u003e(?string $name = null) - получить конкретного охранника или по заданного по дефолту \n- public \u003cb\u003esetDefaultGuard\u003c/b\u003e(GuardInterface $guard) - задать охранника по дефолту \n- public \u003cb\u003egetDefaultGuard\u003c/b\u003e() - получить охранника по дефолту \n- public \u003cb\u003eacces\u003c/b\u003es(string $accessName) - назначить контроллеру определенный доступ \n- public \u003cb\u003egetAccess\u003c/b\u003e(string $accessName) - назначить требуемый доступ \n- public \u003cb\u003esetAccess\u003c/b\u003e(AccessInterface $access) - получить требуемый доступ \n- public \u003cb\u003esetAccessList\u003c/b\u003e(array $accessList) - зарегистрировать список доступов \n- public \u003cb\u003eaddAccessList\u003c/b\u003e(array $accessList) - добавить список доступов \n- public \u003cb\u003eexcept\u003c/b\u003e(...$actions) - исключенные экшны из проверки доступа \n- public \u003cb\u003eonly\u003c/b\u003e(...$actions) - обязательные экшны для проверки доступа \n- public \u003cb\u003e__call\u003c/b\u003e() - magic __call\n\n## Guards\n\nНа данный момент существует два вида Охранников, которые покроют 90% типовых задач создания аутентификации веб-приложений.\nЭто `Sinbadxiii\\PhalconAuth\\Guard\\Session` и `Sinbadxiii\\PhalconAuth\\Guard\\Token`, указывая одного из этих охранников вы выбираете, что будете использовать в своем приложении, аутентификацию на основе сессий или токена.\n\nПредположительно Сессии вы будете использовать в веб-приложениях после логина в личный кабинет,а Токен, например, в микро приложениях в качестве api сервисов. Но ничего вам не мешает применять или комбинировать охранников в нестандартных приложениях.\n\n## Session Guard\n\n```php\nuse Sinbadxiii\\PhalconAuth\\Manager;\nuse App\\Models\\User;\nuse Sinbadxiii\\PhalconAuth\\Adapter\\Model;\nuse Sinbadxiii\\PhalconAuth\\Guard\\Session;\n\n$auth = new Manager();\n\n$configAdapter = [\n    'model' =\u003e User::class,\n];\n\n$adapter = new Model($this-\u003egetSecurity(), $configAdapter);\n$guard   = new Session(\n    $adapter,\n    $this-\u003egetSession(),\n    $this-\u003egetCookies(),\n    $this-\u003egetRequest(),\n    $this-\u003egetEventsManager()\n);\n\n$auth-\u003eaddGuard(\"web\", $guard, true);\n\nreturn $auth;\n```\n\n- public function \u003cb\u003e__construct\u003c/b\u003e(AdapterInterface $adapter, SessionManagerInterface $session,\n  Cookies $cookies, Request $request, EventsManagerInterface $eventsManager)\n- public function \u003cb\u003eattempt\u003c/b\u003e(array $credentials = [], $remember = false) - попытка аутентификации\n- public function \u003cb\u003euser\u003c/b\u003e() - получить аутентифицированного пользователя\n- public function \u003cb\u003evalidate\u003c/b\u003e(array $credentials = []) - валидация входных данных\n- public function \u003cb\u003egetName\u003c/b\u003e() - получение имени сессии\n- public function \u003cb\u003egetRememberName\u003c/b\u003e() - имя куки при запомнить меня\n- public function \u003cb\u003elogin\u003c/b\u003e(AuthenticatableInterface $user, bool $remember = false) - логин экземпляра пользователя\n- public function \u003cb\u003eloginById\u003c/b\u003e($id, bool $remember = false) - логин по Id пользователя\n- public function \u003cb\u003eonce\u003c/b\u003e(array $credentials = []) - логин без сохранения пользователя в сессию\n- public function \u003cb\u003elogout\u003c/b\u003e() - выход \n- public function \u003cb\u003egetLastUserAttempted\u003c/b\u003e() - получение последнего попытавшегося залогиниться пользователя\n- public function \u003cb\u003eviaRemember\u003c/b\u003e() - проверка что пользователь был вытащен из Запомнить меня\n- public function \u003cb\u003egetUser\u003c/b\u003e() - получить пользователя\n- public function \u003cb\u003esetRequest\u003c/b\u003e(Request $request)\n- public function \u003cb\u003esetSession\u003c/b\u003e(SessionManagerInterface $session)\n- public function \u003cb\u003esetCookies\u003c/b\u003e(Cookies $cookies)\n- public function \u003cb\u003egetAdapter\u003c/b\u003e() - получить адаптер поставщика\n- public function \u003cb\u003esetAdapter\u003c/b\u003e(AdapterInterface $adapter) - назначить адаптера поставшика\n\nBasic\n\n- public function \u003cb\u003ebasic\u003c/b\u003e(string $field = 'email', array $extraConditions = []) - аутентификация через Basic Auth\n- public function \u003cb\u003eonceBasic\u003c/b\u003e(string $field = 'email', array $extraConditions = []) - аутентификация через Basic Auth без сохранения в сессию\n\n## Token Guard\n\nЧтобы воспользоваться `Sinbadxiii\\PhalconAuth\\Guard\\Token`, необходимо в качестве второго аргумента передать конфиг с названиями имя параметра запроса и поля в хранилище данных пользователей, например, поле таблицы `users` в бд:\n\n```php\n[\n    ... \n    'inputKey'   =\u003e 'auth_token', //имя параметра с токеном\n    'storageKey' =\u003e 'auth_token', //имя поля в хранилище пользователей\n    ...\n]\n```\n```php\nuse Sinbadxiii\\PhalconAuth\\Manager;\nuse App\\Models\\User;\nuse Sinbadxiii\\PhalconAuth\\Adapter\\Model;\nuse Sinbadxiii\\PhalconAuth\\Guard\\Token;\n\n$auth = new Manager();\n\n$configAdapter = [\n    'model' =\u003e User::class,\n];\n\n$configGuard = [\n    'inputKey'   =\u003e 'auth_token',\n    'storageKey' =\u003e 'auth_token',\n];\n\n$adapter = new Model($this-\u003egetSecurity(), $configAdapter);\n$guard   = new Token(\n    $adapter,\n    $configGuard\n    $this-\u003egetRequest()\n);\n\n$auth-\u003eaddGuard(\"api\", $guard, true);\n\nreturn $auth;\n```\nСоответствено GET запрос должен будет иметь вид: \n\n```shell\n//GET\nhttps://yourapidomain/api/v2/users?auth_token=fGaYgdGPSfEgT41r3F4fg33\n```\nPOST запрос:\n```shell\n//POST\n//params POST request\n[\n  \"auth_token\": \"fGaYgdGPSfEgT41r3F4fg33\"\n]\n\nhttps://yourapidomain/api/v2/users\n```\nили заголовок `Authorization`:\n\n```shell\nAuthorization: Bearer fGaYgdGPSfEgT41r3F4fg33\n\nhttps://yourapidomain/api/v2/users\n```\n\n\u003e Помните, что каждый ваш запрос к приложению, должен сопровождаться параметром `auth_token` с токеном доступа.\n\n- public function \u003cb\u003e__construct\u003c/b\u003e(AdapterInterface $adapter, array $config, Request $request)\n- public function \u003cb\u003euser\u003c/b\u003e() - аутентифицированный пользователь\n- public function \u003cb\u003evalidate\u003c/b\u003e(array $credentials = []) - валидация\n- public function \u003cb\u003egetTokenForRequest\u003c/b\u003e() - поулчить токен из запросов (GET, POST, Headers)\n- public function \u003cb\u003esetRequest\u003c/b\u003e(Request $request)\n- public function \u003cb\u003egetRequest\u003c/b\u003e()\n- public function \u003cb\u003egetAdapter\u003c/b\u003e()\n- public function \u003cb\u003esetAdapter\u003c/b\u003e(AdapterInterface $adapter)\n\n## Создание своего Охранника\n\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace Sinbadxiii\\PhalconAuth\\Guard;\n\nuse Sinbadxiii\\PhalconAuth\\AuthenticatableInterface;\n\ninterface GuardInterface\n{\n    public function check(): bool;\n    public function user();\n    public function setUser(AuthenticatableInterface $user);\n    public function id();\n    public function guest(): bool;\n    public function validate(array $credentials = []): bool;\n}\n```\n\nРеализуя интерфейс `Sinbadxiii\\PhalconAuth\\Guard\\GuardInterface` вы можете создать своего Guard.\n\n## Access\n\nС помощью Доступов (Access) вы можете задавать и проверять требуемый доступ к тем или иным областям приложения, например в контроллер профиля пользователя разрешен доступ только аутентифицированным пользователям.\n\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controllers;\n\nclass ProfileController extends ControllerBase\n{\n    public function onConstruct()\n    {\n        $this-\u003eauth-\u003eaccess(\"auth\");\n    }\n\n    public function indexAction()\n    {\n    }\n}\n```\nВ то время как к контроллеру регистрации, например, нужен доступ только неаутентифицированным пользователям - гостям:\n\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controllers;\n\nclass RegisterController extends ControllerBase\n{\n    public function onConstruct()\n    {\n        $this-\u003eauth-\u003eaccess(\"guest\");\n    }\n\n    public function indexAction()\n    {\n    }\n}\n```\nЗадается доступ в конструкторе контроллера `onConstruct()`.\n\nИз коробки есть два основных вида доступа - аутентифицированный и гостевой:\n\n- `Sinbadxiii\\PhalconAuth\\Access\\Auth`\n- `Sinbadxiii\\PhalconAuth\\Access\\Guest`\n\nЕсли доступ удовлетворяет условию в методе `allowIf`, то дается разрешение на дальнейшее использование контроллера, например в дефолтном `auth` условием является:\n\n```php \nclass Auth extends AbstractAccess\n{\n    /**\n     * @return bool\n     */\n    public function allowedIf(): bool\n    {\n        if ($this-\u003eauth-\u003echeck()) {\n            return true;\n        }\n\n        return false;\n    }\n}\n```\n\n`$this-\u003eauth-\u003echeck()` - проверка на аутентификацию пользователя, т.е. чтобы получить доступ к `$this-\u003eauth-\u003eaccess('auth')` нужно быть аутентифицированным, а вот условие у `$this-\u003eauth-\u003eaccess('guest')` прямо противоположно:\n\n```php \n\u003c?php\n\nnamespace Sinbadxiii\\PhalconAuth\\Access;\n\n/**\n * Class Guest\n * @package Sinbadxiii\\PhalconAuth\\Access\n */\nclass Guest extends AbstractAccess\n{\n    /**\n     * @return bool\n     */\n    public function allowedIf(): bool\n    {\n        if ($this-\u003eauth-\u003eguest()) {\n            return true;\n        }\n\n        return false;\n    }\n}\n```\nВ случае если метод `allowedIf()` вернет `true`, то пользователь сможет идти дальше, если же результат будет равен `false`, то сработает метод неудачи `redirectTo()`, и приложение перенаправит пользователя, т.к. у каждого приложение логика перенаправлений может быть разная, то вам следует создать свои классы Access `auth` и `guest`, наследовав от дефолтных классов и переопределить метод `redirectTo()`:\n```php \n\u003c?php\n\nnamespace App\\Security\\Access;\n\nuse Sinbadxiii\\PhalconAuth\\Access\\Auth as AuthAccess;;\n\nclass Auth extends AuthAccess\n{\n    public function redirectTo()\n    {\n        if (isset($this-\u003eresponse)) {\n            return $this-\u003eresponse-\u003eredirect(\"/login\")-\u003esend();\n        }\n    }\n}\n```\nи\n```php \n\u003c?php\n\nnamespace App\\Security\\Access;\n\nuse Sinbadxiii\\PhalconAuth\\Access\\Guest as GuestAccess;\n\nclass Guest extends GuestAccess\n{\n    public function redirectTo()\n    {\n        if (isset($this-\u003eresponse)) {\n            return $this-\u003eresponse-\u003eredirect(\"/profile\")-\u003esend();\n        }\n    }\n}\n```\nЧтобы создать свой Access, можно имплементировать интерфейс `Sinbadxiii\\PhalconAuth\\Access\\AccessInterface`:\n\n```php \n\u003c?php\n\nnamespace Sinbadxiii\\PhalconAuth\\Access;\n\n/**\n * Interface for Sinbadxiii\\PhalconAuth\\Access\n */\ninterface AccessInterface\n{\n    public function setExceptActions(...$actions): void;\n    public function setOnlyActions(...$actions): void;\n    public function isAllowed(): bool;\n    public function redirectTo();\n    public function allowedIf(): bool;\n}\n```\nлибо просто наследовав абстрактный класс `Sinbadxiii\\PhalconAuth\\Access\\AbstractAccess` для более быстрого и гибкого использования кастомных доступов, например, давайте создадим доступ для пользователей, имеющих роль админа:\n```php \n\u003c?php\n\nnamespace App\\Security\\Access;\n\nuse Sinbadxiii\\PhalconAuth\\Access\\AbstractAccess;\n\nclass Admin extends AbstractAccess\n{\n    /**\n     * @return bool\n     */\n    public function allowedIf(): bool\n    {\n        if ($user = $this-\u003eauth-\u003euser() and $user-\u003egetRole() === \"admin\") {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * @return void\n     * @throws Exception\n     */\n    public function redirectTo()\n    {\n        if (isset($this-\u003eresponse)) {\n            return $this-\u003eresponse-\u003eredirect(\"/admin-login\")-\u003esend();\n        }\n    }\n}\n```\nили пример проверки доступа для Http Basic Auth:\n\n```php \n\u003c?php\n\nnamespace App\\Security\\Access;\n\nuse Sinbadxiii\\PhalconAuth\\Access\\AbstractAccess;\nuse Sinbadxiii\\PhalconAuth\\Exception;\n\nclass AuthWithBasic extends AbstractAccess\n{\n    /**\n     * @return bool\n     */\n    public function allowedIf(): bool\n    {\n        if ($this-\u003eauth-\u003ebasic(\"email\")) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * @return void\n     * @throws Exception\n     */\n    public function redirectTo()\n    {\n        throw new Exception(\"Basic: Invalid credentials.\");\n    }\n}\n```\n\n## Регистрация доступов\n\nДоступы должны быть зарегистрированы в системе аутентификации, если этого не сделать, то при запросе доступа `$this-\u003eauth-\u003eaccess(\"auth\")` будет выдаваться ошибка, типа:\n`Access with 'auth' name is not included in the access list`. \n\nЧтобы зарегистрировать доступы в системе, необходимо создать некоторое промежуточное программное обеспечение, подтипа middleware и прикрепить его к `dispatcher` приложения.\n\nМинимальный вид класса `App\\Security\\Authenticate` будет таков: \n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Security;\n\nuse App\\Security\\Access\\Auth;\nuse App\\Security\\Access\\Guest;\nuse Sinbadxiii\\PhalconAuth\\Access\\Authenticate as AuthMiddleware;\n\n/**\n * Class Authenticate\n * @package App\\Security\n */\nclass Authenticate extends AuthMiddleware\n{\n    protected array $accessList = [\n        'auth'   =\u003e Auth::class,\n        'guest'  =\u003e Guest::class\n    ];\n}\n```\n\nА затем необходимо прикрепить его к сервиc-провайдеру `dispatcher`:\n\n```php \n$di-\u003esetShared('dispatcher', function () use ($di) {\n\n    $dispatcher = new Phalcon\\Mvc\\Dispatcher();\n    $eventsManager = $di-\u003egetShared('eventsManager');\n    $eventsManager-\u003eattach('dispatch', new App\\Security\\Authenticate());\n    $dispatcher-\u003esetEventsManager($eventsManager);\n\n    return $dispatcher;\n});\n```\nСвойство `$accessList` позволяет быстро добавлять новые уровни доступа в приложении, например, чтобы добавить новый доступ `admin`, достаточно создать класс с условием и добавить его в список `$accessList`:\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Security;\n\nuse App\\Security\\Access\\Auth;\nuse App\\Security\\Access\\Admin;\nuse App\\Security\\Access\\Guest;\nuse Sinbadxiii\\PhalconAuth\\Access\\Authenticate as AuthMiddleware;\n\n/**\n * Class Authenticate\n * @package App\\Security\n */\nclass Authenticate extends AuthMiddleware\n{\n    protected array $accessList = [\n        'auth'   =\u003e Auth::class,\n        'guest'  =\u003e Guest::class,\n        'admin'  =\u003e Admin::class,\n    ];\n}\n```\nТак же список доступов можно зарегистрировать непосредственно в Manager при создании сервис провайдера с помощью метода `setAccessList()`:\n```php \n\n$authManager =  new Sinbadxiii\\PhalconAuth\\Manager();\n\n$authManager-\u003esetAccessList(\n    [\n        'auth'   =\u003e App\\Security\\Access\\Auth::class,\n        'guest'  =\u003e App\\Security\\Access\\Guest::class,\n        'admin'  =\u003e App\\Security\\Access\\Admin::class,\n    ];\n);\n    \nreturn $authManager;\n```\n\n## Поставщики (Providers) и Адаптеры (Adapters) \n\nКак уже было сказано ранее поставщики определяют какие сущности будут являться пользователями, например `users` или `contacts`, все зависит от контекста вашего приложения.\n\nВ настоящий момент существуют три вида адаптера:\n\n- `Sinbadxiii\\PhalconAuth\\Adapter\\Model`\n- `Sinbadxiii\\PhalconAuth\\Adapter\\Stream`\n- `Sinbadxiii\\PhalconAuth\\Adapter\\Memory`\n\nМодель, файл и массив с данными в приложении.\nВсе адаптеры наследуются от абстрактного класса `Sinbadxiii\\PhalconAuth\\Adapter\\AbstractAdapter`, который имеет:\n\n- public \u003cb\u003esetModel\u003c/b\u003e(AuthenticatableInterface $model)` - назначить модель поставщика\n- public \u003cb\u003egetModel\u003c/b\u003e()` - получить модель поставщика\n- public \u003cb\u003esetConfig\u003c/b\u003e(array $config)` - установить конфиг\n- public \u003cb\u003egetConfig\u003c/b\u003e()` - получить конфиг адаптера\n\n## Адаптер поставщика `Model`\n\nДля использования адаптера `Model` нам понадобится модель пользователя, например `App\\Models\\User::class` вида:\n\n```php \n\u003c?php\n\nnamespace App\\Models;\n\nuse Phalcon\\Mvc\\Model;\n\nclass User extends Model\n{\n    public $id;\n    public $username;\n    public $name;\n    public $email;\n    public $password;\n    public $published;\n    public $created_at;\n    public $updated_at;\n\n    public function initialize()\n    {\n        $this-\u003esetSource(\"users\");\n    }\n}\n```\n\nЧтобы при использовании в нашем приложении, не выдавалась ошибка:\n\n`PHP Fatal error:  Uncaught TypeError: Sinbadxiii\\PhalconAuth\\Adapter\\Model::validateCredentials(): Argument #1 ($user) must be of type Sinbadxiii\\PhalconAuth\\AuthenticatableInterface`.\n\nТ.е. модель `User` надо имплементировать от `Sinbadxiii\\PhalconAuth\\AuthenticatableInterface`, а если хочется использовать возможности функции `RememberMe` (Запомнить меня), то так же надо будет наследовать интерфейс `Sinbadxiii\\PhalconAuth\\RememberingInterface`:\nВ конечном счете, ваша модель должна иметь класс следующего вида:\n\n```php \n\u003c?php\n\nnamespace App\\Models;\n\nuse Phalcon\\Encryption\\Security\\Random;\nuse Phalcon\\Mvc\\Model;\nuse Sinbadxiii\\PhalconAuth\\RememberingInterface;\nuse Sinbadxiii\\PhalconAuth\\AuthenticatableInterface;\nuse Sinbadxiii\\PhalconAuth\\RememberTokenInterface;\n\nclass User extends Model implements AuthenticatableInterface, RememberingInterface\n{\n    public $id;\n    public $username;\n    public $name;\n    public $email;\n    public $password;\n    public $published;\n    public $created_at;\n    public $updated_at;\n\n    public function initialize()\n    {\n        $this-\u003esetSource(\"users\");\n\n        $this-\u003ehasOne(\n            'id',\n            RememberToken::class,\n            'user_id',\n            [\n                'alias' =\u003e \"remember_token\"\n            ]\n        );\n    }\n\n    public function setPassword(string $password)\n    {\n        $this-\u003epassword = $this-\u003egetDI()-\u003eget(\"security\")-\u003ehash($password);\n        return $this;\n    }\n\n    public function getAuthIdentifier()\n    {\n        return $this-\u003eid;\n    }\n\n    public function getAuthPassword()\n    {\n        return $this-\u003epassword;\n    }\n\n    public function getRememberToken(string $token = null): ?RememberTokenInterface\n    {\n        return $this-\u003egetRelated('remember_token', [\n            'token=:token:',\n            'bind' =\u003e ['token' =\u003e $token]\n        ]);\n    }\n\n    public function setRememberToken(RememberTokenInterface $value)\n    {\n        $this-\u003eremember_token = $value;\n    }\n\n    public function createRememberToken(): RememberTokenInterface\n    {\n        $random = new Random();\n\n        $token = $random-\u003ebase64(60);\n\n        $rememberToken = new RememberToken();\n        $rememberToken-\u003etoken = $token;\n        $rememberToken-\u003euser_agent = $this-\u003egetDI()-\u003eget(\"request\")-\u003egetUserAgent();\n        $rememberToken-\u003eip =  $this-\u003egetDI()-\u003eget(\"request\")-\u003egetClientAddress();\n\n        $this-\u003esetRememberToken($rememberToken);\n        $this-\u003esave();\n\n        return $rememberToken;\n    }\n}\n```\n\nМодель `App\\Models\\RememberToken` будет иметь вид:\n\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Models;\n\nuse Phalcon\\Mvc\\Model;\nuse Sinbadxiii\\PhalconAuth\\RememberTokenInterface;\n\nclass RememberToken extends Model implements  RememberTokenInterface\n{\n    /**\n     * @var integer\n     */\n    public $id;\n\n    /**\n     * @var integer\n     */\n    public $user_id;\n\n    /**\n     * @var string\n     */\n    public $token;\n\n    /**\n     * @var string\n     */\n    public $ip;\n\n    /**\n     * @var string\n     */\n    public $user_agent;\n\n    /**\n     * @var integer\n     */\n    public $created_at;\n\n    /**\n     * @var integer\n     */\n    public $updated_at;\n\n    /**\n     * @var integer\n     */\n    public $expired_at;\n\n    public function initialize()\n    {\n        $this-\u003esetSource(\"users_remember_tokens\");\n    }\n\n    public function getToken(): string\n    {\n        return $this-\u003etoken;\n    }\n\n    public function getUserAgent(): string\n    {\n        return $this-\u003euser_agent;\n    }\n    \n      public function beforeValidationOnCreate()\n    {\n        $this-\u003ecreated_at = date(DATE_ATOM);\n        $this-\u003eupdated_at = date(DATE_ATOM);\n        if (!$this-\u003eexpired_at) {\n            $this-\u003eexpired_at = date(DATE_ATOM);\n        }\n    }\n\n    public function beforeValidationOnSave()\n    {\n        if (!$this-\u003ecreated_at) {\n            $this-\u003ecreated_at = date(DATE_ATOM);\n        }\n        if (!$this-\u003eexpired_at) {\n            $this-\u003eexpired_at = date(DATE_ATOM);\n        }\n        $this-\u003eupdated_at = date(DATE_ATOM);\n    }\n\n    public function beforeValidationOnUpdate()\n    {\n        $this-\u003eupdated_at = date(DATE_ATOM);\n    }\n}\n```\nИнтерфейс `Sinbadxiii\\PhalconAuth\\AuthenticatableInterface` имеет следущий вид:\n\n```php \n\u003c?php\n\nnamespace Sinbadxiii\\PhalconAuth;\n\ninterface AuthenticatableInterface\n{\n    public function getAuthIdentifier();\n    public function getAuthPassword();\n}\n```\n\nа реализация \"Запомнить меня\" - `Sinbadxiii\\PhalconAuth\\RememberingInterface`:\n\n```php \n\u003c?php\n\nnamespace Sinbadxiii\\PhalconAuth;\n\ninterface RememberingInterface\n{\n    public function getRememberToken(): ?RememberTokenInterface;\n    public function createRememberToken(): RememberTokenInterface;\n}\n```\n\nТеперь можно использовать модель при создании менеджера:\n\n```php \n    use Sinbadxiii\\PhalconAuth\\Adapter\\Model;\n    use Sinbadxiii\\PhalconAuth\\Guard\\Session;\n    use Sinbadxiii\\PhalconAuth\\Manager;\n\n    $security = $this-\u003egetSecurity();\n\n    $adapter = new Model($security);\n    $adapter-\u003esetModel(App\\Models\\User::class);\n    $guard   = new Session(\n        $adapter,\n        $this-\u003egetSession(),\n        $this-\u003egetCookies(),\n        $this-\u003egetRequest(),\n        $this-\u003egetEventsManager()\n    );\n\n\n    $manager = new Manager();\n    $manager-\u003eaddGuard(\"web\", $guard);\n    \n    $manager-\u003esetDefaultGuard($guard);\n\n    return $manager;\n```\n\n## Адаптер поставщика `memory`\n\nИспользуя `setData()` можно задать массив данных с пользователями, который имеет вид:\n\n```php \n[\n    [\"username\" =\u003e\"admin\", \"name\" =\u003e \"admin\", 'password' =\u003e 'admin', \"email\" =\u003e \"admin@admin.ru\"],\n    [\"username\" =\u003e \"user\", \"name\" =\u003e \"user\", 'password' =\u003e 'user', \"email\" =\u003e \"user@user.ru\"],\n]\n```\n\n```php \n$di-\u003esetShared(\"auth\", function () {\n\n    $security = $this-\u003egetSecurity();\n\n    $data = [\n        [\"auth_token\" =\u003e '1', \"name\" =\u003e \"admin\", \"username\" =\u003e \"admin\", 'password' =\u003e 'admin', \"email\" =\u003e \"admin@admin.ru\"],\n        [\"auth_token\" =\u003e '2',  \"name\" =\u003e \"admin1\", \"username\" =\u003e \"admin\", 'password' =\u003e 'admin1', \"email\" =\u003e \"admin1@admin.ru\"],\n    ];\n\n    $adapter     = new \\Sinbadxiii\\PhalconAuth\\Adapter\\Memory($security);\n    $adapter-\u003esetModel(App\\Models\\UserSimple::class);\n    $adapter-\u003esetData($data);\n    \n    $configGuard = [\n        'inputKey'   =\u003e 'auth_token',\n        'storageKey' =\u003e 'auth_token',\n    ];\n\n    $guard = new \\Sinbadxiii\\PhalconAuth\\Guard\\Token(\n        $adapter,\n        $configGuard,\n        $this-\u003egetRequest()\n    );\n    \n    $manager = new Manager();\n    $manager-\u003eaddGuard(\"api\", $guard, true);\n\n    return $manager;\n});\n```\n\n- public \u003cb\u003esetData\u003c/b\u003e(array $data) - массив с данными\n- public \u003cb\u003egetData\u003c/b\u003e() - получить массив с данными\n\n## Адаптер поставщика `Stream`\n\nЕсли взять в качестве адаптера поставщиков `users` не `Sinbadxiii\\PhalconAuth\\Adapter\\Model`, а файл `Sinbadxiii\\PhalconAuth\\Adapter\\Stream`:\nто необходимо будет задать источник файла формата `json`, например, `users.json`, который имеет вид:\n\n```json \n[\n  {\"name\":\"admin\", \"username\":\"admin\", \"password\": \"admin\",\"email\": \"admin@admin.ru\"},\n  {\"name\":\"user\", \"username\":\"user\", \"password\": \"user\",\"email\": \"user@user.ru\"}\n]\n```\n\nВозвращаемый пользователь в виде модели `App\\Models\\UserSimple` должен будет реализовывать интерфейс `Sinbadxiii\\PhalconAuth\\AuthenticatableInterface`, например:\n\n```php \n\u003c?php\n\nnamespace App\\Models;\n\nuse Phalcon\\Auth\\AuthenticatableInterface;\n\nclass UserSimple implements AuthenticatableInterface\n{\n    /**\n     *\n     * @var integer\n     */\n    public $id;\n\n    /**\n     *\n     * @var string\n     */\n    public string $username;\n\n    /**\n     *\n     * @var string\n     */\n    public string $name;\n\n    /**\n     *\n     * @var string\n     */\n    public string $email;\n\n    /**\n     *\n     * @var string\n     */\n    public string $password;\n\n    /**\n     *\n     * @var integer\n     */\n    public $published;\n\n    public function __construct($data)\n    {\n        foreach ($data as $field =\u003e $value) {\n            $this-\u003e$field = $value;\n        }\n    }\n\n    /**\n     * @return int\n     */\n    public function getAuthIdentifier(): mixed\n    {\n        return $this-\u003eid;\n    }\n\n    /**\n     * @return string\n     */\n    public function getAuthPassword(): string\n    {\n        return $this-\u003epassword;\n    }\n}\n\n```\n\nно следует учитывать, что нельзя будет использовать функцию `RememberMe` (Запомнить меня), т.к. `Stream`\nне имплементирует интерфейс `Sinbadxiii\\PhalconAuth\\RememberingInterface` ввиду отсутствия возможности сохранить токен сессии в файлом хранилище пользователей (что не мешает вам реализовать эту функцию в своем охраннике на основе хранилища в файле). \n\n```php \n    $security = $this-\u003egetSecurity();\n\n    $adapter  = new \\Sinbadxiii\\PhalconAuth\\Adapter\\Stream($security);\n    $adapter-\u003esetModel(App\\Models\\UserSimple::class);\n    $adapter-\u003esetFileSource(__DIR__ . \"/users.json\");\n\n    $guard = new \\Sinbadxiii\\PhalconAuth\\Guard\\Session(\n        $adapter,\n        $this-\u003egetSession(),\n        $this-\u003egetCookies(),\n        $this-\u003egetRequest(),\n        $this-\u003egetEventsManager()\n    );\n\n    $manager = new Manager();\n    $manager-\u003eaddGuard(\"web\", $guard, true); //третий аргумент - назначить охранника по дефолту\n\n    return $manager;\n```\n\n- public \u003cb\u003esetFileSource\u003c/b\u003e(string $pathSrcFile) - указать путь к файлу\n- public \u003cb\u003egetFileSource\u003c/b\u003e() - получить путь к файлу\n- public \u003cb\u003esetData\u003c/b\u003e(array $data) - массив с данными пользователей\n- public \u003cb\u003egetData\u003c/b\u003e() - получить массив с данными пользователей\n\n\n\n\u003e Не рекомендуется использовать адаптеры `stream` и `memory` в реальных приложениях из-за их функциональной ограниченности и сложности управления пользователями. Это может быть полезно в прототипах приложений и для ограниченных приложений, которые не хранят пользователей в базах данных.\n\n## Создание своего адаптера поставщика\n\nИнтерфейс адаптера поставщика `Sinbadxiii\\PhalconAuth\\Adapter\\AdapterInterface` имеет вид:\n\n```php \n\u003c?php\n\nnamespace Sinbadxiii\\PhalconAuth\\Adapter;\n\nuse Sinbadxiii\\PhalconAuth\\AuthenticatableInterface;\n\ninterface AdapterInterface\n{\n    public function findFirstByCredentials(array $credentials);\n    public function findFirstById($id);\n    public function validateCredentials(AuthenticatableInterface $user, array $credentials): bool;\n}\n```\n\nТак же для создания функционала \"Запомнить меня\" нужна реализация интерфейса `Sinbadxiii\\PhalconAuth\\Adapter\\AdapterWithRememberTokenInterface`:\n\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace Sinbadxiii\\PhalconAuth\\Adapter;\n\nuse Sinbadxiii\\PhalconAuth\\AuthenticatableInterface;\nuse Sinbadxiii\\PhalconAuth\\RememberingInterface;\nuse Sinbadxiii\\PhalconAuth\\RememberTokenInterface;\n\ninterface AdapterWithRememberTokenInterface\n{\n    public function findFirstByToken($identifier, $token, $user_agent): ?AuthenticatableInterface;\n    public function createRememberToken(RememberingInterface $user): RememberTokenInterface;\n}\n```\n\n## Manager Factory\n\n`Sinbadxiii\\PhalconAuth\\MangerFactory` - это создание менеджера аутентификации с минимальными усилиями, если вы не хотите настраивать вручную менеджер аутентификации, а хотите быстро запустить сервис провайдер аутентификации, вы можете сделать это так:\n```php\n$di-\u003esetShared('auth', function () { \n   \n    $manager = new \\Sinbadxiii\\PhalconAuth\\ManagerFactory();\n    \n    return $manager;\n});\n```\n\nВсе, дальше `ManagerFactory` сделает все за вас, на основе вашего конфигурационного файла. По умолчанию используется конфигурация из `$this-\u003econfig-\u003eauth`, если вы хотите использовать другую конфигурацию, отличную от `$this-\u003econfig-\u003eauth` то можно передать в качестве первого аргумента другой конфиг:\n\n```php\n$di-\u003esetShared(\"auth\", function () {\n    $config = $this-\u003egetConfig()-\u003eauth_config_other;\n\n    $manager = new \\Sinbadxiii\\PhalconAuth\\ManagerFactory($config-\u003etoArray());\n\n    return $manager;\n});\n```\n### Пример конфигурационного файла для использования Сессий\n\nИтак, типичный пример конфигурационного файла приложения на основе Сессий. Файл может находится в папке конфигов `config/auth.php` или в глобальном файле `config.php` с доступом по ключу `auth` (`$this-\u003econfig-\u003eauth`).\n\n```php\n\u003c?php\n[\n    'auth' =\u003e [\n        'defaults' =\u003e [ //дефолтные значения\n            'guard' =\u003e 'web'  //дефолтный охранник\n        ],\n        'guards' =\u003e [   //список охранников\n            'web' =\u003e [          \n                'driver' =\u003e 'session',   //драйвер сессия\n                'provider' =\u003e 'users',   //поставщики users\n            ],\n        ],\n        'providers' =\u003e [\n            'users' =\u003e [\n                'adapter' =\u003e 'model',  //адаптер поставщика users - model\n                'model'  =\u003e App\\Models\\User::class,   //модель\n            ]\n        ]\n    ],\n];\n```\n\nТ.е. приложение будет использовать `guard = web`. В свою очередь Охранник web основан на драйвере `session` и использует поставщика пользователей `users`, которые извлекаются через Адаптера `model` - `App\\Models\\Users`.\nДанный конфигурационный файл позволяет создавать различные комбинации охранников и поставщиков, разделяя доступы в вашем приложений.\n\n### Пример конфигурационного файла для использования Токена\n\n```php\n\u003c?php\n[\n    'auth' =\u003e [\n        'defaults' =\u003e [\n            'guard' =\u003e 'api'\n        ],\n        'guards' =\u003e [\n            'api' =\u003e [\n                'driver' =\u003e 'token',\n                'provider' =\u003e 'users',\n                'inputKey' =\u003e 'auth_token', //опционально, по дефолту auth_token\n                'storageKey' =\u003e 'auth_token', //опционально, по дефолту auth_token\n            ],\n        ],\n        'providers' =\u003e [\n            'users' =\u003e [\n                'adapter' =\u003e 'model',\n                'model'  =\u003e App\\Models\\User::class,\n            ]\n        ]\n    ],\n];\n```\n\nРасширить охранников можно с помощью `extendGuard` и передать в качестве аргумента имя охранника, используемого в конфиге  `jwt`, а так же `Closure` с передачей аргументов в новый класс охранника, например:\n\n```php\n$di-\u003esetShared('auth', function () {\n    $auth = new \\Sinbadxiii\\PhalconAuth\\ManagerFactory();    \n    \n    $request = $this-\u003egetRequest();\n\n    $manager-\u003eextendGuard(\"jwt\", function ($adapter, $config) use ($request) {\n        return new JwtGuard($adapter, $config, $request);\n    });\n    \n    return $auth;\n});\n```\n\nВы можете расширить список адаптеров с помощью метода `extendProviderAdapter`, например:\n\n```php \n$di-\u003esetShared(\"auth\", function () {\n    $authManager =  new Phalcon\\Auth\\ManagerFactory();\n\n    $authManager-\u003eextendProviderAdapter(\"mongo\", function($security, $configProvider) {\n        return new App\\Security\\Adapter\\Mongo($security, $configProvider);\n    });\n\n    return $authManager;\n});\n```\n\n\n## Методы\n\n### Задать требуемый доступ к контроллеру\n\nМетод `access()` позволит задать требуемый доступ к контроллеру, из коробки `auth` - для аутентифицированных, `guest` - для гостей. \n\n```php\n$this-\u003eauth-\u003eaccess(\"auth\") \n```\n```php \n\u003c?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controllers;\n\nclass ProfileController extends ControllerBase\n{\n    public function onConstruct()\n    {\n        $this-\u003eauth-\u003eaccess(\"auth\");\n    }\n\n    public function indexAction()\n    {\n    }\n}\n```\n\n### Проверка аутентификации текущего пользователя\n\nЧтобы определить, аутентифицирован ли пользователь, выполняющий входящий HTTP-запрос, вы можете использовать метод `check()`. Этот метод вернет true, если пользователь аутентифицирован:\n```php\n$this-\u003eauth-\u003echeck(); \n//check authentication\n```\nНапример, вы можете проверить на странице формы входа, что если пользователь вошел в систему, то не показывать ему форму ввода:\n\n```php\npublic function loginFormAction()\n{\n    if ($this-\u003eauth-\u003echeck()) { \n        //redirect to profile page \n        return $this-\u003eresponse-\u003eredirect(\n            \"/profile\", true\n        );\n    }\n}\n```\n\n### Получение аутентифицированного пользователя\n\nПри обработке входящего запроса вы можете получить доступ к аутентифицированному пользователю с помощью метода `user()`. Результатом будет провайдер, указанный в конфигурации `config-\u003eauth`, в соответствии с интерфейсом `Sinbadxiii\\PhalconAuth\\AuthenticatableInterface`.\n\nВы также можете запросить идентификатор пользователя (ID) с помощью метода `id()`:\n\n```php \n$this-\u003eauth-\u003euser(); //get the user\n\n$this-\u003eauth-\u003eid(); //get user id\n```\n\n### Попытка аутентификации\n\nМетод `attempt()` используется для обработки попыток аутентификации из формы входа в ваше приложение:\n```php \n$username = $this-\u003erequest-\u003egetPost(\"username\");\n$password = $this-\u003erequest-\u003egetPost(\"password\");\n\n//attempt login with credentials\nif ($this-\u003eauth-\u003eattempt(['username' =\u003e $username, 'password' =\u003e $password])) {\n\n //success attempt\n ...\n}\n\n//fail attempt\n```\n\nМетод `attempt()` принимает в качестве первого аргумента массив пар ключ/значение. Значения в массиве будут использоваться для поиска пользователя в таблице базы данных пользователей. Итак, в приведенном выше примере пользователь будет получен по значению столбца имени пользователя. Если пользователь найден, хешированный пароль, хранящийся в базе данных, будет сравниваться со значением пароля, переданным методу. Вы не должны хешировать значение входящего запроса пароля, так как пароль уже автоматически хэшируется, чтобы сравнить его с хешированным паролем в базе данных. Аутентифицированный сеанс будет запущен для пользователя, если хешированные пароли совпадают.\n\nПомните, что пользователи из вашей базы данных будут запрашиваться на основе конфигурации «поставщика».\n\nМетод `attempt()` вернет `true`, если аутентификация прошла успешно. В противном случае будет возвращено `false`.\n\n### Указание дополнительных учетных данных\n\nВы также можете добавить запрос дополнительных данные в дополнение к электронной почте/имени пользователя и паролю. Для этого просто добавьте условия запроса в массив, переданный методу `attempt()`. Например, мы можем проверить, является ли пользователь опубликованным `is_published`:\n\n```php \n$username = $this-\u003erequest-\u003egetPost(\"username\");\n$password = $this-\u003erequest-\u003egetPost(\"password\");\n\n//attempt login with additional credentials\nif ($this-\u003eauth-\u003eattempt(['username' =\u003e $username, 'password' =\u003e $password, 'is_published' =\u003e 1])) {\n\n //success attempt\n ...\n}\n\n//fail attempt\n```\n\n### \"Запомнить меня\"\n\nЕсли вы хотите обеспечить функциональность «запомнить меня» в своем приложении, вы можете передать логическое значение в качестве второго аргумента метода попытки.\n\nЕсли это значение равно `true`, пользователь будет аутентифицироваться на неопределенный срок или до тех пор, пока пользователь не выйдет из системы вручную с помощью `logout()`. Таблица `users_remember_tokens` содержит столбец строки токена, который будет использоваться для хранения токена «запомнить меня»:\n```php \n$username = $this-\u003erequest-\u003egetPost(\"username\");\n$password = $this-\u003erequest-\u003egetPost(\"password\");\n$remember = this-\u003erequest-\u003egetPost('remember') ? true : false;\n\n//attempt login with credentials and remember\nif ($this-\u003eauth-\u003eattempt(['username' =\u003e $username, 'password' =\u003e $password], $remember)) {\n\n //success attempt\n ...\n}\n\n//fail attempt\n```\nИспользуйте метод `viaRemember()`, чтобы проверить, аутентифицирован ли пользователь с помощью файла cookie «запомнить меня»:\n```php\n//use method viaRemember to check the user was authenticated using the remember me cookie\n$this-\u003eauth-\u003eviaRemember();\n```\n\n### Аутентифицировать пользовательский экземпляр\n\nЕсли вам нужно установить существующий пользовательский экземпляр в качестве текущего аутентифицированного пользователя, вы можете передать пользовательский экземпляр методу `login()`. Данный пользовательский экземпляр должен быть реализацией `Sinbadxiii\\PhalconAuth\\AuthenticatableInterface`.\n\nЭтот метод аутентификации полезен, когда у вас уже есть действующий экземпляр пользователя, например, сразу после регистрации пользователя в вашем приложении:\n\n```php\n$user = Users::findFirst(1);\n// Login and Remember the given user\n$this-\u003eauth-\u003elogin($user, $remember = true);\n```\n\n### Аутентифицировать пользователя по идентификатору\n\nДля аутентификации пользователя с использованием первичного ключа записи в базе данных вы можете использовать метод `loginById()`. Этот метод принимает первичный ключ пользователя, которого вы хотите аутентифицировать:\n\n```php\n//and force login user by id \n$this-\u003eauth-\u003eloginById(1, true);\n```\n\n### Аутентифицировать пользователя один раз\n\nИспользуя метод `once()` вы можете аутентифицировать пользователя в приложении для одного запроса. При вызове этого метода не будут использоваться сессии или файлы cookie:\n\n```php\n//once auth without saving session and cookies\n$username = $this-\u003erequest-\u003egetPost(\"username\");\n$password = $this-\u003erequest-\u003egetPost(\"password\");\n$this-\u003eauth-\u003eonce(['username' =\u003e $username, 'password' =\u003e $password]);\n```\n\n## Выход\n\nЧтобы вручную разлогинить пользователя из вашего приложения, вы можете использовать метод `logout()`. После этого удалится вся информация об аутентификации из сессии пользователя, так что последующие запросы уже не будут аутентифицированы.\n\n```php\n\n$this-\u003eauth-\u003elogout();\n//log out user \n```\n\n## HTTP Basic Authentication\n\n[Базовая аутентификация HTTP](https://en.wikipedia.org/wiki/Basic_access_authentication) обеспечивает быстрый способ аутентификации пользователей вашего приложения без настройки специальной страницы «входа в систему». Достаточно передать в заголовке `Authorization`, значение `Basic` и пары емейл (либо другое поле пользователя) и пароль, разделенные двоеточием и закодированые `base64_encode()`\n\nМетод `$this-\u003eauth-\u003ebasic(\"email\")` позволит создать свой Access для использования доступа с помощью Auth Basic.\n\nАргумент `email` указывает на то, что поиск пользователя будет осуществляться по полям email и password. Указав другое поле, например `username`, поиск будет осуществляться по паре `username` и `password`:\n\n```php \n\u003c?php\n\nnamespace App\\Security\\Access;\n\nuse Sinbadxiii\\PhalconAuth\\Access\\AbstractAccess;\nuse Sinbadxiii\\PhalconAuth\\Exception;\n\nclass AuthWithBasic extends AbstractAccess\n{\n    /**\n     * @return bool\n     */\n    public function allowedIf(): bool\n    {\n        if ($this-\u003eauth-\u003ebasic(\"email\")) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * @return void\n     * @throws Exception\n     */\n    public function redirectTo()\n    {\n        throw new Exception(\"Basic: Invalid credentials.\");\n    }\n}\n```\nПосле запроса, в сессию запишется пользователь, и последующие запросы, могут уже не содержать пользовательские данные в заголовке `Authorization`, до тех пор пока сессия не \"стухнет\".\n\n### Basic HTTP-аутентификация без сохранения состояния\n\nВы можете использовать базовую аутентификацию HTTP без сохранения пользователя в сессии. Это в первую очередь полезно, если вы решите использовать HTTP-аутентификацию для аутентификации запросов к API вашего приложения. Для этого можно создать Access, который вызывает метод `onceBasic()`, например:\n\n```php \n\u003c?php\n\nnamespace App\\Security\\Access;\n\nuse Sinbadxiii\\PhalconAuth\\Access\\AbstractAccess;\nuse Sinbadxiii\\PhalconAuth\\Exception;\n\nclass AuthWithBasic extends AbstractAccess\n{\n    /**\n     * @return bool\n     */\n    public function allowedIf(): bool\n    {\n        if ($this-\u003eauth-\u003eonceBasic(\"email\")) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * @return void\n     * @throws Exception\n     */\n    public function redirectTo()\n    {\n        throw new Exception(\"Basic: Invalid credentials.\");\n    }\n}\n```\n\nПосле запроса, ни куки, ни сессия не будут содержать данные о пользователе, и следущий запрос так же должен содержать пользовательские данные заголовка `Authorization`, иначе будет вызвано исключение `Sinbadxiii\\PhalconAuth\\Exceptions`\n\n## Events\n\n| Event Name   | Can stop operation? |\n|--------------|-----------------|\n| beforeLogin  | Yes             |\n| afterLogin   | No              |\n| beforeLogout | Yes             |\n| afterLogout  | No              |\n\n\n### License\nThe MIT License (MIT). Please see [License File](https://github.com/sinbadxiii/phalcon-auth/blob/master/LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsinbadxiii%2Fphalcon-auth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsinbadxiii%2Fphalcon-auth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsinbadxiii%2Fphalcon-auth/lists"}