Skip to content

Instantly share code, notes, and snippets.

@ephrin
Created March 27, 2014 10:38
Show Gist options
  • Save ephrin/9804707 to your computer and use it in GitHub Desktop.
Save ephrin/9804707 to your computer and use it in GitHub Desktop.
Генерация токенов при помощи конфигуратора.
<?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