Як використовувати вирази у безпеці, маршртутизації сервісах та валідації

Дата оновлення перекладу 2023-06-22

Як використовувати вирази у безпеці, маршртутизації сервісах та валідації

Symfony має потужний компонент ExpressionLanguage. Він дозволяє вам додавати високоналаштовувану логіку всередині конфігурації.

Фреймворк Symfony використовує вирази одразу після установки наступними способами:

Щоб дізнатися більше про те, як створювати та працювати з виразами, див. Синтаксис .

Безпека: Складний контроль доступу за допомогою виразів

На додаток до ролі на кшталт ROLE_ADMIN, метод isGranted() також приймає об'єкт Expression:

1
2
3
4
5
6
7
8
9
10
11
use Symfony\Component\ExpressionLanguage\Expression;
// ...

public function indexAction()
{
    $this->denyAccessUnlessGranted(new Expression(
        '"ROLE_ADMIN" in roles or (user and user.isSuperAdmin())'
    ));

    // ...
}

У цьому прикладі, якщо поточний користувач має ROLE_ADMIN або якщо метод об'єкта поточного користувача isSuperAdmin() повертає true, тоді доступ буде дозволено (примітка: ваш об'єкт користувача може не мати методу isSuperAdmin(), цей метод був придуманий для цього прикладу).

Використовується вираз, і ви можете дізнатися більше про синтаксис мови виразів, див. Синтаксис .

Всередині виразу у вас є доступ до таких змінних:

user
Об'єкт користувача (або рядок anon, якщо ви не аутентифіковані).
roles
Масив ролей, які має користувач, включно з ієрархією ролей , але не включаючи атрибути IS_AUTHENTICATED_* (див. функції нижче).
object
Об'єкт (якщо він є), який передається як другий аргумент isGranted().
token
Об'єкт мітки.
trust_resolver
Об'єкт AuthenticationTrustResolverInterface: ви швидше за все будете використовувати функції is_*() нижче.

Додатково у вас є доступ до багатьох функцій всередині додатка:

is_authenticated
Повертає true якщо користувач аутентифікований за допомогою "запам'ятати мене" або аутентифікований "повністю", тобто повертає "true" якщо користувач "виконав вхід".
is_anonymous
Прирівнюється до використання IS_AUTHENTICATED_ANONYMOUSLY з функцією isGranted().
is_remember_me
Схоже, але не дорівнює IS_AUTHENTICATED_REMEMBERED, див. нижче.
is_fully_authenticated
Схоже, але не дорівнює IS_AUTHENTICATED_FULLY, див. нижче.
has_role
Перевіряє, чи має користувач роль - еквівалент виразу на кшталт 'ROLE_ADMIN' in roles.

Функції is_remember_me() та is_authenticated_fully() схожі на використання IS_AUTHENTICATED_REMEMBERED та IS_AUTHENTICATED_FULLY з функцією isGranted(), але вони не однакові. Написане нижче демонструє відмінність:

1
2
3
4
5
6
7
8
9
use Symfony\Component\ExpressionLanguage\Expression;
// ...

$ac = $this->get('security.authorization_checker');
$access1 = $ac->isGranted('IS_AUTHENTICATED_REMEMBERED');

$access2 = $ac->isGranted(new Expression(
    'is_remember_me() or is_fully_authenticated()'
));

Тут, $access1 і $access2 матимуть однакове значення. На відміну від поведінки IS_AUTHENTICATED_REMEMEMBERED та IS_AUTHENTICATED_FULLY, функція is_remember_me() повертає "true" тільки якщо користувач аутентифікований за допомогою кукі "запам'ятати мене", а is_fully_authenticated повертає "true" тільки якщо користувач дійсно виконав вхід протягом цієї сесії (тобто є повноцінним).