Mam taki problem:
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.