Як захистити будь-який сервіс або метод у вашому додатку
Дата оновлення перекладу 2023-06-23
Як захистити будь-який сервіс або метод у вашому додатку
У статті про безпеку, ви можете дізнатися, як
захистити контролер , запросивши сервіс
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, щоб дізнатися більше.