В Symfony есть так называемый фаервол.
В моём проекте это выглядит так:
security:
encoders:
App\Entity\User:
algorithm: auto
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
app_security_user_provider:
id: App\Security\UserProvider
# registration:
# pattern: ^/secure.registration
# stateless: true
# anonymous: true
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
authorization:
pattern: ^/authorization
security: false
main:
anonymous: ~
stateless: true
provider: app_security_user_provider
guard:
authenticators:
- App\Security\Authenticator
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication
# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/profile, roles: ROLE_USER }
Это глобальная защита всех маршрутов.
Так же существует так называемая локальная защита чего-то, например каких то действий в экшене.
// throw exception
$this->denyAccessUnlessGranted(UserVoter::READ["read"], User::class, "Вам запрещено просматривать пользователей.");
// or
// return boolean
$this->isGranted(UserVoter::READ["read"], User::class)