Created
March 27, 2014 10:38
-
-
Save ephrin/9804707 to your computer and use it in GitHub Desktop.
Генерация токенов при помощи конфигуратора.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Достаем сущность пользователя. | |
| * @var $entity UserInterface|DocumentInterface | |
| */ | |
| $entity = $this->getDI()->get(\Services::dm)->getRepository(Partner::class)->findOneBy( | |
| ['username' => 'assolua291'] | |
| ); | |
| /** | |
| * Создаем конфигуратор токена | |
| * обязательным аргументом конструктора должен быть \Acme\Security\Core\Authentication\Provider\CsrfTokenProvider | |
| */ | |
| $tokenConfig = new PersistentTokenConfigurator($this->getDI()->get(\Services::csrfTokenProvider)); | |
| /** | |
| * Варианты определения сущности к которой относится пользователь | |
| */ | |
| $customIdentitySet = true; | |
| if ($customIdentitySet) { | |
| /** | |
| * Для определения пользователя привязанного к токену | |
| * конфигуратору необходимы класс сущности и идентификатор | |
| */ | |
| $tokenConfig->identity()->setClass(get_class($entity))->setIdentifier($entity->getId()); | |
| } else { | |
| /** | |
| * Если пользователь является реализацией интерфейса \Models\Documents\DocumentInterface | |
| * Мы можем сразу отдать его в этот метод, | |
| * который знает что с ним делать и как достать идентификаторы | |
| * Этот метод предпочтительнее, поскольку интерфейс неявно гарантирует, | |
| * что пользователь будет правильно загружен из базы документов | |
| */ | |
| $tokenConfig->setDocumentIdentity($entity); | |
| } | |
| /** | |
| * Создаем инстанс интервала для подальшего использования в аргументах | |
| */ | |
| $interval = new \DateInterval('P1D'); | |
| /** | |
| * Здесь мы задаем когда именно срок жизни токена истекает. Тоесть время смерти токена. | |
| */ | |
| $tokenConfig->setExpired((new \DateTime())->add($interval)); | |
| /** | |
| * Здесь же мы задаем на сколько жизнь токена будет продлена после каждого считывания его из базы | |
| */ | |
| $tokenConfig->setRenewDelay(new \DateInterval('P1D')); | |
| /** | |
| * Можно задать дополнительную роль токену, которая не присуща нашему пользователю по-умолчанию. | |
| * Удобно для использования в апи методах с ограниченным уровнем доступа (типа спец пропуск) | |
| */ | |
| $tokenConfig->setRoles(['ROLE_SERVICE']); | |
| /** | |
| * Супер фишка! еще сырая достаточно | |
| * Можно добавить триггер для токена в качестве вызываемого метода. | |
| * Этот триггер будет вызыватся КАЖДІЙ РАЗ, когда токен будет загружен из базы и присвоен в | |
| * \Acme\Security\Core\SecurityContext | |
| * ВАЖНО триггер будет вызван в независимости от того прошел токен авторизацию или нет! | |
| * | |
| * Принимается любой callable тип. | |
| * С замыканиями (\Closure) (т.е. анонимными функциями) будьте предельно осторожны. | |
| * Необходимо помнить, что область видимости замыкания после десериализации будет другой. | |
| * Во всех callable рекомендуется использовать данные из аргументов. | |
| * Аргументы: | |
| * - $token \Acme\Security\Core\Authentication\Token\TokenInterface | |
| * Собственно сам токен в виде TokenInterface, который пришел из базы. | |
| * - $securityContext \Acme\Security\Core\SecurityContext | |
| * как видно в примере из $securityContext вы можете достать контейнер сервисов и рулить далее | |
| */ | |
| $tokenConfig->addTrigger( | |
| function (TokenInterface $token, SecurityContext $securityContext) { | |
| $user = $token->getUser(); | |
| if ($user instanceof UserInterface) { | |
| /** @var \MongoCollection $aCol */ | |
| $aCol = $securityContext->getDi()->get(\Services::mongoTest)->selectCollection('a'); | |
| $aCol->insert( | |
| [ | |
| 'user' => $user->getUsername(), | |
| 't' => time(), | |
| 'message' => 'This one was inserted by trigger' | |
| ] | |
| ); | |
| } | |
| } | |
| ); | |
| /** | |
| * Можно так же задать любой набор аттрибутов к токену который может быть сохранен в MongoDB | |
| * используется для чтения во время следующего использования токена | |
| * ВНИМАНИЕ этот метод вытирает все триггеры с токена | |
| * Для установки кастомного аттрибута смотрите ниже | |
| */ | |
| $tokenConfig->setAttributes( | |
| [ | |
| 'a' => 1 | |
| ] | |
| ); | |
| /** | |
| * Установка катомного именованого атрибута. | |
| */ | |
| $tokenConfig->setAttribute('transactionId', 10557); | |
| /** | |
| * Собственно сам метод сохранения токена в базу и генерации его ключа, | |
| * который можно будет использовать в запросах | |
| */ | |
| $tokenString = $tokenConfig->persist(); | |
| return [ | |
| 'tokenString' => $tokenString | |
| ]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment