Как защитить любой сервис или метод в вашем приложении

Как защитить любой сервис или метод в вашем приложении

В статье о безопасности, вы можете узнать, как защитить контроллер , запросив сервис 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, чтобы узнать больше.