Posiadam dwa bundle (jedna aplikacja) na różnych domenach:
Backend: cms.app.com
Frontend: app.com
Konfigurację ogólną dla całości (config.yml) mam taką:
imports: - { resource: parameters.yml } - { resource: security.yml } - { resource: services.yml } - { resource: "@ProjectBackendBundle/Resources/config/config.yml" } - { resource: "@ProjectFrontendBundle/Resources/config/config.yml" } . . . ####### standardowe rzeczy configuracji frameworka . . . jms_i18n_routing: default_locale: "%locale%" locales: ["%locale%", en] strategy: prefix_except_default fos_user: db_driver: orm # other valid values are 'mongodb', 'couchdb' user_class: Project\BackendBundle\Entity\User
app/config/security.yml (ogólny):
security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: ROLE_ADMIN providers: fos_userbundle: id: fos_user.user_provider.username firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login: pattern: ^/login anonymous: true frontend: pattern: ^/ form_login: provider: fos_userbundle csrf_provider: form.csrf_provider logout: true anonymous: true backend: pattern: ^/ form_login: provider: fos_userbundle csrf_provider: form.csrf_provider logout: true anonymous: false access_control: - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/, role: ROLE_ADMIN }
Powyżej zdefiniowałem dwa firewalle dla każdego bundla osobny, tak żeby można było na frontend wchodzić jako anonymous, natomiast ma backend tylko po zalogowaniu.
Dla backendu BackendBundle/Resources/config/config.yml:
imports: - { resource: services.yml } fos_user: firewall_name: backend
Dla frontendu FrontendBundle/Resources/config/config.yml:
imports: - { resource: services.yml } fos_user: firewall_name: frontend
Niestety takie coś nie działa... brany jest pod uwagę zawsze pierwszy firewall, niezależnie od wykorzystywanego bundla (w tym wypadku frontend). Niezależnie od wartości fos_user:
firewall_name: backend w config.yml w BackendBundle. Próbowałem tez rozdzielić security.yml dla kazdego z bundli osobno ale pojawił się błąd: Please define all elements for this path in one config file, więc wróciłem do jednego, głównego pliku security z dwoma firewallami.
Prośba o pomoc do kogoś, kto już przez to przebrnął.
Pozdrawiam i z góry dzięki za pomoc.
Ok udało mi się dotrzeć do mechanizmu powstałego w sf 2.2.
services.yml:
services: # firewall different hosts services site.frontend.request_matcher: class: Symfony\Component\HttpFoundation\RequestMatcher arguments: ["/", "^(?!cms)(.*)$"] site.backend.request_matcher: class: Symfony\Component\HttpFoundation\RequestMatcher arguments: ["/", "^cms(.*)$"]
security.yml:
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login: pattern: ^/login anonymous: true frontend: request_matcher: site.frontend.request_matcher pattern: ^/ form_login: provider: fos_userbundle csrf_provider: form.csrf_provider logout: true anonymous: true backend: request_matcher: site.backend.request_matcher pattern: ^/ form_login: provider: fos_userbundle csrf_provider: form.csrf_provider logout: true anonymous: false
I teraz działa jak powinno, tzn. na domenie bez 'cms' user jest jako anonymous i wpuszcza na aplikację, na domenie z 'cms' natomiast jako niezalogowany i przekierowuje go na ekran logowania.