Как защитить любой сервис или метод в вашем приложении
Дата обновления перевода 2023-06-29
Как защитить любой сервис или метод в вашем приложении
В статье о безопасности, вы можете узнать, как
защитить контроллер , запросив сервис
security.authorization_checker
из сервис-контейнера и проверив роль
текущего пользователя:
1 2 3 4 5 6 7 8 9
// ...
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
public function helloAction($name)
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
// ...
}
Вы также можете защитить любой сервис, внедрив в него сервис security.authorization_checker
.
Чтобы получить общие сведения о внедрении зависимостей в ваши сервисы, смотрите
статью Сервис-контейнер. Например, представьте, что у вас есть класс
NewsletterManager
, который отправляет электронные письма и вы хотите ограничить
его использование только для пользователей, имеющих роль ROLE_NEWSLETTER_ADMIN
.
До того, как вы добавите защиту, класс выглядит как-то так:
1 2 3 4 5 6 7 8 9 10 11 12
// src/AppBundle/Newsletter/NewsletterManager.php
namespace AppBundle\Newsletter;
class NewsletterManager
{
public function sendNewsletter()
{
// ... то, где вы на самом деле делаете работу
}
// ...
}
Ваша цель - проверить роль пользователя, когда вызывается метод sendNewsletter()
.
Первый шаг на пути к этому - внедрение сервиса security.authorization_checker
в
объект:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// src/AppBundle/Newsletter/NewsletterManager.php
// ...
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class NewsletterManager
{
protected $authorizationChecker;
public function __construct(AuthorizationCheckerInterface $authorizationChecker)
{
$this->authorizationChecker = $authorizationChecker;
}
public function sendNewsletter()
{
if (!$this->authorizationChecker->isGranted('ROLE_NEWSLETTER_ADMIN')) {
throw new AccessDeniedException();
}
// ...
}
// ...
}
Если вы используете конфигурацию services.yml по умолчанию ,
Symfony автоматически передаст security.authorization_checker
в ваш сервис, благодаря
автомонтированию и типизированию AuthorizationCheckerInterface
.
Если текущий пользователь не имеет ROLE_NEWSLETTER_ADMIN
, то он будет
приглашён выполнить вход в систему.
Защита методов с использованием аннотаций
Вы также можете защитить вызовы методов в любом сервисе с аннотациями, используя необязательный пакет JMSSecurityExtraBundle. Этот пакет не включён в стандартную версию Symfony, но вы можете установить его сами.
Смотрите JMSSecurityExtraBundle Documentation, чтобы узнать больше.