Дата обновления перевода 2022-02-03

Безопасность: Сложный контроль доступа с выражениями

See also

Наилучшим решением для работы со сложными правилами авторизации является использование Системы избирателей.

В дополнение к роли вроде ROLE_ADMIN, метод isGranted() также принимает объект Expression:

// src/Controller/MyController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpFoundation\Response;

class MyController extends AbstractController
{
    public function index(): Response
    {
        $this->denyAccessUnlessGranted(new Expression(
            '"ROLE_ADMIN" in role_names or (not is_anonymous() and user.isSuperAdmin())'
        ));

        // ...
    }
}

В этом примере, если текущий пользователь имеет ROLE_ADMIN или если метод объекта текущего пользователя isSuperAdmin() возвращает true, то доступ будет гарантирован (примечание: ваш объект Пользователь может не иметь метода isSuperAdmin(), этот метод был выдуман для данного примера).

Используется выражение, и вы можете узнать больше о синтаксисе языка выражений, см. The Expression Syntax.

Внутри выражения у вас есть доступ к нескольким переменным:

user
Объект пользователя (или строка anon, если вы не аутентифицированы).
role_names
Массив ролей, которые имеет пользователь, со строковым представлением. Этот массив включает в себя все роли, предоставленные не напрямую через иерархию ролей, но не включает атрибуты IS_AUTHENTICATED_* (см. функции ниже).
object
Объект (если есть), которые передаётся в качестве второго аргумента isGranted().
subject
Хранит то же значение, что и object, поэтому они эквивалентны.
token
Объект токена.
trust_resolver
Объект AuthenticationTrustResolverInterface,: вы скорее всего будете использовать функции is_*(), описанные ниже.

Кроме того, у вас есть доступ к следующим функциям внутри выражения:

is_authenticated()
Возвращает true, если пользователь аутентифицирован через “запомнить меня” или “полностью” аутентифицирован - т.е. возвращает “true”, если пользователь находится в системе.
is_anonymous()
Возвращает true, если пользователь анонимен. То есть, если файерволл подтверждает, что не знает идентичности пользователя. Это отличается от IS_AUTHENTICATED_ANONYMOUSLY, который предоставляется всем пользователям, включая аутентифицированных.
is_remember_me()
Похоже на, но не эквивалентно IS_AUTHENTICATED_REMEMBERED, см. ниже.
is_fully_authenticated()
Похоже, но не эквивалентно IS_AUTHENTICATED_FULLY, см. ниже.
is_granted()
Проверяет, есть ли у пользователя заданное разрешение. Дополнительно принимает второй аргмент с объектом, где проверяется разрешение. Эквивалентно использованию метода isGranted() из сервиса безопасности.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.