Да, я знаю, что Учебник для избирателей в кулинарной книге . Но я ищу что-то немного другое. Мне нужно два разных слоя черного списка:
- запретить определенному IP-адресу доступ ко всему сайту
- запретить вход на определенный IP-адрес
Я написал Voter, который проверяет, есть ли IP пользователя в базе данных. Для первого сценария я написал слушатель ядра, который проверяет каждый запрос и выдает 403 в случае, если он встречает заблокированного пользователя:
if (VoterInterface::ACCESS_DENIED === $this->voter->vote($token, $this, array())) {
throw new AccessDeniedHttpException('Blacklisted, punk!');
}
Первая проблема заключается в самом VoterInterface
, что вынуждает меня использовать TokenInterface $token
, который мне не нужен в этом случае. Но это не имеет большого значения, я думаю. Следующее, что я действительно должен был использовать AccessDeniedHttpException
, поскольку AccessDeniedException
всегда пытается перенаправить меня на страницу входа и вызывает бесконечный цикл перенаправления в этом случае. Я бы смирился с этим, так как он отлично работает в dev
среде, но когда я переключаюсь на prod
, я получаю 503 со следующим в логе продукта:
[2011-11-21 20:54:04] security.INFO: заполненный SecurityContext с помощью
анонимный токен [] []
[2011-11-21 20:54:04] request.ERROR:
Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException:
В черном списке, панк! (uncaught исключения) в строке XXX 28 [] []
[2011-11-21 20:54:04] request.ERROR: Возникает исключение при обработке
исключение
(Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException:
В черном списке, панк!) [] []
Из того, что я прочитал, может быть проблема с xdebug, но это происходит, даже когда я выключаю его. Я также попробовал ваниль \Exception
, и он делает то же самое. У кого-нибудь есть идеи, почему это происходит? Или, может быть, какое-то другое решение для такого черного списка.
Кроме того, я не знаю, как решить второй случай, так как я не знаю, как остановить пользователя до того, как ему назначат токен. Мое текущее решение имеет дело с InteractiveLoginEvent , проверкой внесения пользователя в черный список и, если да, удалением его токена. Это не кажется безопасным, и мне не очень комфортно с этим. Итак, есть идеи, как решить эту проблему? Я предполагаю, что мне просто не хватает очевидного «события перед входом».