Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony] Problem z FosUserBundle
Forum PHP.pl > Forum > PHP > Frameworki
blackroger
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ą:

  1. imports:
  2. - { resource: parameters.yml }
  3. - { resource: security.yml }
  4. - { resource: services.yml }
  5. - { resource: "@ProjectBackendBundle/Resources/config/config.yml" }
  6. - { resource: "@ProjectFrontendBundle/Resources/config/config.yml" }
  7.  
  8. .
  9. .
  10. .
  11. ####### standardowe rzeczy configuracji frameworka
  12. .
  13. .
  14. .
  15.  
  16.  
  17. jms_i18n_routing:
  18. default_locale: "%locale%"
  19. locales: ["%locale%", en]
  20. strategy: prefix_except_default
  21.  
  22. fos_user:
  23. db_driver: orm # other valid values are 'mongodb', 'couchdb'
  24. user_class: Project\BackendBundle\Entity\User


app/config/security.yml (ogólny):
  1. security:
  2. encoders:
  3. FOS\UserBundle\Model\UserInterface: sha512
  4.  
  5. role_hierarchy:
  6. ROLE_ADMIN: ROLE_USER
  7. ROLE_SUPER_ADMIN: ROLE_ADMIN
  8.  
  9. providers:
  10. fos_userbundle:
  11. id: fos_user.user_provider.username
  12.  
  13. firewalls:
  14. dev:
  15. pattern: ^/(_(profiler|wdt)|css|images|js)/
  16. security: false
  17.  
  18. login:
  19. pattern: ^/login
  20. anonymous: true
  21.  
  22. frontend:
  23. pattern: ^/
  24. form_login:
  25. provider: fos_userbundle
  26. csrf_provider: form.csrf_provider
  27. logout: true
  28. anonymous: true
  29.  
  30. backend:
  31. pattern: ^/
  32. form_login:
  33. provider: fos_userbundle
  34. csrf_provider: form.csrf_provider
  35. logout: true
  36. anonymous: false
  37.  
  38. access_control:
  39. - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
  40. - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
  41. - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
  42. - { 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:
  1. imports:
  2. - { resource: services.yml }
  3.  
  4.  
  5. fos_user:
  6. firewall_name: backend


Dla frontendu FrontendBundle/Resources/config/config.yml:
  1. imports:
  2. - { resource: services.yml }
  3.  
  4. fos_user:
  5. 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:
  1. services:
  2. # firewall different hosts services
  3. site.frontend.request_matcher:
  4. class: Symfony\Component\HttpFoundation\RequestMatcher
  5. arguments: ["/", "^(?!cms)(.*)$"]
  6.  
  7. site.backend.request_matcher:
  8. class: Symfony\Component\HttpFoundation\RequestMatcher
  9. arguments: ["/", "^cms(.*)$"]


security.yml:
  1. firewalls:
  2. dev:
  3. pattern: ^/(_(profiler|wdt)|css|images|js)/
  4. security: false
  5.  
  6. login:
  7. pattern: ^/login
  8. anonymous: true
  9.  
  10. frontend:
  11. request_matcher: site.frontend.request_matcher
  12. pattern: ^/
  13. form_login:
  14. provider: fos_userbundle
  15. csrf_provider: form.csrf_provider
  16. logout: true
  17. anonymous: true
  18.  
  19. backend:
  20. request_matcher: site.backend.request_matcher
  21. pattern: ^/
  22. form_login:
  23. provider: fos_userbundle
  24. csrf_provider: form.csrf_provider
  25. logout: true
  26. anonymous: false
  27.  


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.
cadavre
Problem w tym, że Symfony2 analizuje dostęp do zasobów po właśnie patternach, które zdefiniowane są w security.yml - w tym wypadku oba patterny były identyczne - dlatego zawsze tylko pierwszy był brany pod uwagę (nie zważając na nazwę hosta). Konfiguracja z config.yml (firewalla dla fos_user'a) nie miała wpływu na proces autoryzacji, który przeprowadzany jest przed inicjalizacją konfiguracji dla bundle'i, nie wiem nawet po co ten parametr tam jest. ;p

Rozwiązaniem jest nadpisanie RequestMatcher'a o weryfikację hosta - tutaj jednak z pomocą przychodzi parametr arguments w konfiguracji, który zastępuje konieczność nadpisywania tego service'u.

Istnieje nawet Issue na GitHubie, który traktuje o możliwości przypisania firewalla do konkretnego hosta - jednak od pół roku nic się w tej sprawie nie stało (zapewne ze względu na istniejącą możliwość, którą pokazałeś). Jeśli masz ochotę dorzuć komentarz na https://github.com/symfony/symfony/issues/7103 - może ktoś przyjrzy to jeszcze raz. : )
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.