Symfony 3.4: как заставить де-аутентификацию - PullRequest
0 голосов
/ 08 ноября 2019

Мой защищенный пользователь полностью аутентифицирован с некоторыми ролями, полученными из некоторой системы. Я хочу проверить, существует ли одна из ролей, а если нет, я хочу принудительно де-аутентифицировать пользователя.

В моем приемнике событий при входе в систему я делаю это:

use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class SecurityEventSubscriber implements EventSubscriberInterface {
  private $token;
  private $checker;
  private $container;
  private $session;

  public function __construct(TokenStorageInterface $token, AuthorizationCheckerInterface $checker, ContainerInterface $container, SessionInterface $session) {
    $this->token = $token;
    $this->checker = $checker;
    $this->container = $container;
    $this->session = $session;
  }


  public function login() {  
    if(!$this->checker->isGranted('IS_AUTHENTICATED_FULLY')) {
        $this->session->invalidate();
        $this->token->setToken(null);
        throw new AccessDeniedException();
    } else {
        $user = $this->token->getToken()->getUser();
        $roles = $user->getRoles();
        $found = false;

        foreach ($roles as $role) {
            if($role->getRole() === $this->container->getParameter('role_expected')) {
                $found = true;
                break;
            }
        }

        if(!$found) {
            $this->session->invalidate();
            $this->token->setToken(null);
            throw new AccessDeniedException();
        } else {
            $user->removeAllRoles();
        }
    }
  }
}

Как вы видите, я пытался использовать setToken для нуля, но он не работает (исключение).

HКак мне попросить де-аутентифицировать пользователя?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вместо проверки пользовательских разрешений на вашем контроллере вы можете создать пользовательскую проверку пользователей, которая может запретить аутентификацию на основе вашей пользовательской логики.

Пример проверки пользователя

namespace AppBundle\Security;
use AppBundle\Security\User as AppUser;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class UserChecker implements UserCheckerInterface
{
    public function checkPreAuth(UserInterface $user)
    {
        if (!$user instanceof AppUser) {
            return;
        }

        if (!in_array('SOME_ROLE', $user->getRoles())) {
            // throw an AccountStatusException exception here
        }
    }
}

Если вы также хотите выполнить проверку ролей пользователя после того, как пользователь вошел в систему (если его роли могут измениться во время сеанса), вы можете использовать метод checkPostAuth().


Вы также должны упомянуть использование своей пользовательской программы проверки пользователей в файле app/config/security.yml.

security:
    firewalls:
        main:
            pattern: ^/
            user_checker: AppBundle\Security\UserChecker

Дополнительная информация здесь

0 голосов
/ 08 ноября 2019

Самый простой способ - перенаправить пользователя на маршрут выхода из системы.

К сожалению, не существует специального метода, который бы просто обрабатывал весь процесс выхода из системы за вас. За исключением, может быть, если вам удастся вызвать этот метод в допустимом экземпляре Symfony\Component\Security\Http\Firewall\LogoutListener.

Выход из Symfony работает так:

  • Он обрабатывается этимслушатель
  • слушатель вызывается при каждом запросе
  • слушатель проверяет, запрошен ли маршрут === маршрут выхода из системы
  • Если запрошенный маршрут === маршрут выхода из системы, слушатель выходит из системы пользователя
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...