2015-11-11 2 views
2

У меня есть правило брандмауэра, которое вместе с аннотациями разрешает доступ только к действиям в качестве конкретного пользователя.Symfony 2 Защита входа с IP-адресом

Кроме того, я хотел бы заблокировать ЛЮБОЙ логин, если он не из определенной сети. В поисках решения я столкнулся с дополнительными правилами access_control после этого guide.

Проблема в том, что я ограничу свою страницу входа через правила IP. Я всегда получаю ошибку ERR_TOO_MANY_REDIRECTS, если кто-то пытается ее достичь. Я бы предпочел, чтобы у меня появилось сообщение «Страница не найдена», даже чтобы кто-то извне не знал, что может быть какой-либо логин.

Как я могу это сделать с Symfony?

security.yml:

security: 
    ... 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     default: 
      form_login: 
       provider: fos_userbundle 
       login_path: /login 
       use_forward: false 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/logout$, role: ROLE_ADMIN } 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https, ips: [127.0.0.1, fe80::1, ::1]} 
     - { path: ^/login$, roles: ROLE_NO_ACCESS } 
     - { path: ^/admin, role: ROLE_ADMIN, requires_channel: https} 
+0

Что произошло в apache error.log? –

+0

Ничего, просто «Ребенок: начало 150 рабочих потоков». Это сообщение перезагрузки. Вы можете видеть только что-то в access.log, где 31 раз «127.0.0.1 - - [11/Ноябрь/2015: 17: 20: 47 +0100]» GET/login HTTP/1.1 »302 344'is writen – lony

+0

, когда вы удаление 'require_channel: https' бесконечный цикл все еще существует? –

ответ

1

Если я не ошибаюсь, что делает здесь Symfony, это попытаться соответствовать роли пользователя в том, что требуется для пути. Если он не соответствует одной из этих ролей, он отправляет пользователя на страницу входа.

Проблема заключается в том, что страница входа в систему - это то место, откуда пользователь только что пришел. Таким образом, пользователь попадает в бесконечный цикл, поскольку их условие никогда не может быть выполнено.

Я бы предложил разместить страницу входа вне брандмауэра и просто поместить проверку IP-кода в код страницы LOGIN, а если не встретить, выгрузите в другое место, что не входит в межсетевой экран.

+0

Как это сделать, представляя только код статуса 404? – lony

+0

Это хороший пример для вас: http://symfony.com/doc/2.3/book/controller.html#managing-errors-and-404-pages – Adi

+0

Спасибо, и как я могу заставить Symfony перенаправить на мой 404 если данный IP-адрес не соответствует? – lony

Смежные вопросы