@galliard

Как в symfony secure проверить авторизованность пользователя?

В общем черт дернул меня связаться с набором костылей под названием "Symfony Security Component", которые ставят в тупик даже при самых простых задачах.

Суть задачи: надо определить, авторизован пользователь или нет. Для этого Security Component предлагает внедрить инстанс TokenStorageInterface, из которого можно дернуть инстанс TokenInterface, который свою очередь содержит метод isAuthenticated. Казалось бы, ура, я решил задачу! Если бы не одно НО! Он возвращает true. Всегда. Вот вообще всегда. Даже когда пользователь не авторизован. Фабьен что, каких-то голюценогенных лягушек обожрался, когда это делал? Где логика вообще?

Если у того же инстанса TokenInterface вызвать метод getUsername, то мы получим строку 'anon.'

В общем вопрос такой: а нормальные способы проверить авторизацию пользователя есть? Или не завезли? Очень не хотелось бы делать сравнение со строкой 'anon.'
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
https://symfony.com/doc/current/components/securit...
/** @var AuthorizationCheckerInterface $authorizationChecker */
if (!$authorizationChecker->isGranted('ROLE_USER')) {
    throw new AccessDeniedException();
}


Если роль пользователя неважна (хотя хорошая практика все-таки всегда выдавать базовую роль)
https://symfony.com/doc/current/security.html#chec...
/** @var AuthorizationCheckerInterface $authorizationChecker */
if (!$authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    throw new AccessDeniedException();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
IgorPI
@IgorPI
В 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)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы