2013-07-26 12 views
11

Próbuję sprawdzić, czy użytkownik znajduje się w bezpiecznej zaporze.Symfony2 - wykryj, czy użytkownik znajduje się w bezpiecznej zaporze sieciowej.

security.yml:

firewalls: 
    non_secure_area: 
     pattern: ^/ 
     anonymous: true 
    secure_area: 
     pattern: ^/admin 
     form_login: 
      #etc. 
     logout: 
      #etc. 

Więc muszę wiedzieć, czy użytkownik znajduje się wewnątrz „secure_area” bezpiecznej części witryny.

Użyłem tego, ale oczywiście mówi mi tylko, czy ktoś jest "zalogowany" ORAZ na stronie HTTPS. Musi być lepszy sposób:

if($request->isSecure() && $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 

} 
+0

Zdjąć 'non_secure_area' firewall, to niepotrzebne. –

Odpowiedz

10

Możesz pobrać token zabezpieczający i klucz dostępu.

$token = $securityContext->getToken(); 
$providerKey = $token->getProviderKey(); // secured_area 

Nie zapomnij sprawdzić, czy istnieje, a jego żeton nie instancją AnonymousToken

+0

Dzięki, ale osobiście nadal nie sądzę, że to wystarcza (oczywiście może nie być to możliwe w Symfony2, ponieważ jest to zrobić więcej, co prawdopodobnie oznacza, że ​​odpowiedź jest najlepsza). Jeśli zmieni się nazwa "secure_area", będziemy mieli problemy. Wyobraź sobie, że tworząc pakiet do dystrybucji, nie możesz być pewien, jaka będzie nazwa firewalla app/config/security.yml. Czy nie ma opcji, która po prostu zwraca wartość true, jeśli przeglądanie trasy wymaga zalogowania się użytkownika? – user2143356

+0

Możesz sprawdzić dowolną rolę, na przykład "ROLE_USER". Jeśli interesuje Cię tylko sprawdzenie, czy dany użytkownik wprowadził hasło, należy sprawdzić "IS_AUTHENTICATED_FULLY". http://symfony.com/doc/current/book/security.html#retrieving-the-user-object –

+0

Dzięki, ale nie jest to obiekt użytkownika, którego chcę. Powiedziałbym, że sprawdzenie, czy trasa znajduje się w bezpiecznej zaporze, nie ma nic wspólnego z obiektem użytkownika. – user2143356

0

Jeśli jesteś w czymś, co jest ContainerAware, można uzyskać Request, a następnie URI [see docs]:

$request = $this->container->get('request'); 
$uri = $request->getUri(); 

Następnie można sprawdzić taki ciąg przed /admin, jak chcesz.

+0

Witam. Dzięki, ale liczyłem na lepszą metodę, taką jak ta, która nie jest związana z nazwą zabezpieczonego obszaru lub adresu URL. Jeśli napisałem kod podobny do twojego powyżej w kontrolerze, ale wtedy moja aplikacja/config/security.yml kiedykolwiek zawierał inną ścieżkę, wtedy coś by się zepsuło. Może gdyby można było uzyskać nazwę i parametry używanej obecnie firewalla (jeśli w ogóle), mógłbym dopasować URI do "wzorca" (tak jak zdefiniowałem w konfiguracji) tej zapory. – user2143356

Powiązane problemy