2012-09-06 13 views
5

Mamy system, w którym administratorzy i zwykli użytkownicy są obsługiwani przez ich własnych oddzielnych dostawców zabezpieczeń. Spowodowało to problem na stronach administracyjnych, ponieważ administratorzy nie mają dostępu do plików ani obrazów znajdujących się za zaporą strony głównej, chyba że są również zalogowani do witryny głównej.Symfony 2: Dostęp do zapory sieciowej z dwoma oddzielnymi dostawcami

Obrazy i pliki muszą być dostępne dla wszystkich uwierzytelnionych użytkowników i administratorów, niezależnie od dostawcy. Są podawane za pośrednictwem kontrolera, który zapewnia dokładniejszą kontrolę dostępu.

Czy można zdefiniować więcej niż jednego dostawcę, aby zezwolić na dostęp do trasy?

Oto okrojona wersja naszego obecnego security.yml:

security: 
    providers: 
     admin_user_db: 
      entity: { class: OurAdminUserBundle:AdminUser, property: username } 
     site_user_db: 
      entity: { class: OurSiteUserBundle:SiteUser, property: username } 
    firewalls: 
     admin_login: 
      pattern: ^/admin/login$ 
      security: false 
     site_user_login: 
      pattern: ^/login 
      security: false 
     file_route: 
      pattern: ^/file 
      anonymous: ~ 
      ### We need to allow this route only for authorized users from 
      ### either admin_user_db or site_user_db providers 
     admin_secured_area: 
      pattern: ^/admin 
      http_basic: ~ 
      provider: admin_user_db 
      form_login: 
       check_path: /admin/login_check 
       login_path: /admin/login 
      logout: 
       path: /admin/logout 
       target:/
     site_secured_area: 
      pattern: .* 
      http_basic: ~ 
      provider: site_user_db 
      form_login: 
       check_path: /check_login 
       login_path: /login 
       failure_path: /login 
       failure_forward: false 
      logout: 
       path: /logout 
       target:/

Odpowiedz

5

Chyba to, czego szukasz jest ChainProvider. Dostawca ten będzie skonfigurowany do korzystania z dwóch aktualnych dostawców w sposób sekwencyjny.

Dostawca łańcuchów spróbuje najpierw uwierzytelnić użytkownika za pomocą pierwszego dostawcy, dla którego został skonfigurowany. Jeśli to się uda, użytkownik zostanie uwierzytelniony. Jeśli jest to porażka, dostawca łańcucha spróbuje następnego i tak dalej, dopóki nie będzie można wypróbować kolejnych dostawców.

Użyłem tej techniki, aby umożliwić użytkownikom uwierzytelnianie za pomocą formularza logowania lub logowania na Facebooku. Miałem dwóch dostawców, jeden dla Facebooka, jeden dla formy. Następnie w mojej zaporze dostawca był dostawcą sieci, a następnie użytkownicy mogli logować się za pomocą swoich danych uwierzytelniających lub konta na Facebooku.

Ponieważ dostawca łańcuchów jest sekwencyjny, sugeruję, aby umieścić dostawcę, który prawdopodobnie będzie najczęściej używany jako pierwszy.

Oto próbka konfiguracja wzięte ze strony dokumentacji Symfony:

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, user_db] 
     in_memory: 
      users: 
       foo: { password: test } 
     user_db: 
      entity: { class: Acme\UserBundle\Entity\User, property: username 

Można spojrzeć na documenation tutaj:

  1. Using Multiple User Providers

Pozdrowienia, Matt

+0

Dziękuję za odpowiedź, udało nam się skonfigurować 'ChainProvider' z tymi instrukcjami (chociaż myślę, że składnia była nieco inna w nasza wersja Symfony). Ostatecznie skończyło się porzucenie 'AdminUser' i użycie ról zamiast tego, jak sugeruje @jperovic, ponieważ zdaliśmy sobie sprawę, że oddzielni dostawcy nie są naprawdę potrzebni w naszym scenariuszu. – Kaivosukeltaja

1

Miałem trochę doświadczenia z tym problemem, a rozwiązanie to było tym, które napisał: Matt.

Jednakże, ponieważ na zewnętrznej stronie aplikacji znajdowały się zapory administracyjne, studenckie i nauczycielskie, w razie potrzeby nie udało mi się osiągnąć sukcesu personifikacji. Oznacza to, że użytkownicy z administracji mogą podszywać się pod użytkowników ze swojej ściany ogniowej i tylko tych.

Teraz możliwe jest, że zrobiłem coś złego, ale ponieważ był to czas wrażliwy zadanie zdecydowaliśmy się umieścić wszystko za pojedynczy zaporę i niech różne role wykonać zadanie. To okazało się znacznie prostszym rozwiązaniem, ale ostatecznie to zależy od ciebie ...