Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF2][Symfony] Problem z FosUserBundle, Problem z FosUserBundle
blackroger
post 12.08.2013, 08:56:45
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
cadavre
post 13.08.2013, 22:23:58
Post #2





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


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. : )


--------------------
Silesian PHP User Group - www.spug.pl
Symfony2, OAuth2, budowanie API - masz pytania? Pisz!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 08:12