Як захистити будь-який сервіс або метод у вашому додатку

Дата оновлення перекладу 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, щоб дізнатися більше.