У меня есть приложение Symfony2, разделенное на 2 пакета: BackendBundle
для API и FrontendBundle
для AngularJS «клиент». Все работает под брандмауэром.Symfony2: разрешить доступ ко всем непревзойденным маршрутам анонимно
BackendBundle
имеет сущности, обрабатывает маршруты API; FrontendBundle
имеет угловые виды, маршрутизацию и т.д., и имеет только один контроллер с шаблоном:
class AngularController extends Controller {
/**
* @Route("/{route}", name="angular_index_all_unmatched_routes", requirements={"route" = ".*"})
* @Template("FrontendBundle::index.html.twig")
*/
public function angularIndexAction($route) {
return ['route' => $route];
}
}
FrontendBundle
маршрутизация определяются как последний ресурс в app/config/routing.yml
, который будет вызвана только тогда, когда любой другой маршрут не был подобран. Благодаря этому он может обрабатывать маршруты с угловым HTML5-режимом, если к ним обращаются напрямую (например, copy-paste) - и он работает нормально.
То, что я хочу сделать, это определить межсетевой экран и/или контроль доступа в таким образом, что все эти несогласованные маршруты (обрабатываются AngularController::angularIndexAction()
) может быть доступен анонимным пользователем.
Почему? Я хочу открыть некоторые маршруты API (через frontend proxy), чтобы они были доступны не пользователям (например, URL-адреса подтверждения, отправленные по электронной почте, с некоторым сообщением пользователю).
Я не хочу указывать список контроля доступа для каждого анонимного «Углового» маршрута, я хотел бы сделать это только для маршрутов API. В конце концов, эти непревзойденные маршруты должны открывать индекс Angular, который должен знать, если пользователь вошел в систему (для отображения полного или упрощенного макета) и должен обрабатывать угловые маршруты и отображать какое-то сообщение «Access denied», если запрос не выполнен (есть слушатель Symfony и перехватчик Angle's $provide
).
Любые предложения?
Edit: @Security
аннотацию на AngularController::angularIndexAction()
не работает, он по-прежнему перенаправляет на брандмауэр точку входа.
Edit2:. Вот фрагмент security.yml
firewalls:
unsecured:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
anonymous: true
secured:
pattern: '^.*$'
form_login:
login_path: /our-provider/login
check_path: /our-provider/callback/
anonymous: true
entry_point: our_provider.entry_point
access_control:
- { path: '^/our-provider/(login(/[a-zA-Z]+)?|logout|redirect|callback)', roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: '^/', roles: ROLE_USER }
Я знаю, что { path: '^/', roles: ROLE_USER }
будет перенаправлять все маршруты на страницу входа, если пользователь не вошел в систему, я предположил, что это очевидно и не упомянул об этом , Я хочу, чтобы сила ROLE_USER
для соответствовала маршрутам и давала IS_AUTHENTICATED_ANONYMOUSLY
для тех, кто не имеет себе равных, без четкого определения каждого интерфейса «прокси-маршрут». В моем случае нет страницы 404 Symfony, потому что все идет по маршруту angular_index_all_unmatched_routes
, и там определение угловой маршрутизации решает, есть ли что-то для обработки или нет.
Есть ли у вас какие-либо другие маршруты помимо '^ /', которые не предназначены для анонимности? –
Да, все '^/api /' например.На данный момент API с «псевдоавторией», поскольку он основан на одном и том же брандмауэре от безопасности Symfony. Таким образом, в основном пользователь должен войти в приложение для использования API (потому что это только для связи с внешним интерфейсом прямо сейчас, оно будет изменено, если мы откроем API для других клиентов). Таким образом, брандмауэр настроен на '' ^. * $ 'Для автоматического перенаправления на страницу входа для анонимных пользователей. Итак, подведем итог: используйте брандмауэр для существующих маршрутов Symfony, разрешите анонимный доступ для угловых маршрутов, обработанных 'AngularController :: angularIndexAction()'. – Wirone
DId, вы получите это, чтобы работать? –