2013-09-06 13 views
8

Piszę aplikację ajax z uwierzytelnianiem ajax i teraz zacząłem używać komponentu bezpieczeństwa symfony w silex do obsługi uwierzytelniania/autoryzacji.
Wykonując prosty test z prostą konfiguracją, idę do chronionego obszaru przez zaporę ogniową, a odpowiedź, którą otrzymuję, jest przekierowaniem na stronę /login, ale potrzebuję w mojej aplikacji odpowiedzi 401 z możliwymi dodatkowymi informacjami (w nagłówkach lub json body), jak się zalogować.Odpowiedź symfony zwrot 401 zamiast przekierowania

$app['security.firewalls'] = [ 
    'api' => [ 
     'pattern' => '^/api', 
     'logout' => ['logout_path'=>'/auth/logout'], 
     'users' => $app->share(function(Application $app) { 
      return new MyUserProvider(); 
     }) 
    ] 
]; 

EDIT: Dostałem wskazówkę, ale nie jestem pewien, jak go używać. Implementacja punktu wejścia z AuthenticationEntryPointInterface Mogę powiedzieć api, jak odpowiedzieć na nieuwierzytelnione żądania i dać użytkownikowi instrukcje potrzebne do uwierzytelnienia. To może być moja odpowiedź 401 z instrukcjami logowania.

Odpowiedz

4

Potrzebny jest program obsługi AuthenticationEntryPoint. Prosty przykład:

class AuthenticationEntryPoint implements AuthenticationEntryPointInterface { 

/** 
* Starts the authentication scheme. 
* 
* @param Request $request The request that resulted in an AuthenticationException 
* @param AuthenticationException $authException The exception that started the authentication process 
* 
* @return Response 
*/ 
public function start(Request $request, AuthenticationException $authException = null) 
{ 
    $array = array('success' => false); 
    $response = new Response(json_encode($array), 401); 
    $response->headers->set('Content-Type', 'application/json'); 

    return $response; 
} 
} 

klasa Rejestracja jako usługa w pliku services.xml:

<parameters> 
    <parameter key="authentication_entry_point.class">YourNameSpace\AuthenticationEntryPoint</parameter> 
</parameters> 

<services> 
    <service id="authentication_entry_point" class="%authentication_entry_point.class%"/> 
</services> 

i dokonać małej zmiany w security.yml pliku:

security: 
    firewalls: 
    somename: 
     entry_point: authentication_entry_point 
1

udało mi aby zastąpić domyślny punkt wejścia dla typu "formularz" pod zaporą "api", taką jak ta:

$app['security.entry_point.api.form'] = $app->share(function() use ($app) { 
    return new MyAuthenticationEntryPoint(); 
}); 

Wtedy to tylko kwestia wdrożenia AuthenticationEntryPointInterface:

http://symfony.com/doc/current/components/security/firewall.html#entry-points

przyjrzeć się realizacji symfony, aby zorientować się:

Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint 

Także chyba warto sprawdzić na Silex dostawca usług bezpieczeństwa, aby zobaczyć, jak wprowadzają to do "security.entry_point.form._proto" domyślnego narzędzia.

Silex\Provider\SecurityServiceProvider 
Powiązane problemy