Дата обновления перевода 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.