2013-09-06 9 views
8

Ich schreibe eine Ajax-Anwendung mit Ajax-Authentifizierung und jetzt begann ich mit der Symfony Security-Komponente in Silex, um Authentifizierung/Autorisierung zu behandeln.
Ich mache einen einfachen Test mit einer einfachen Konfiguration, gehe zu einem geschützten Bereich durch die Firewall und die Antwort ist eine Umleitung auf die /login Seite, aber was ich brauche in meiner App ist eine 401 Antwort mit möglichen zusätzlichen Informationen (in Kopfzeilen oder JSON-Körper), wie man sich anmeldet.Symfony Security Return 401 Antwort statt Redirect

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

EDIT: bekam ich einen Hinweis, aber ich bin nicht sicher, wie es zu benutzen. Durch die Implementierung eines Einstiegspunktes mit AuthenticationEntryPointInterface kann ich der API mitteilen, wie sie nicht authentifizierte Anfragen beantwortet und dem Benutzer die notwendigen Anweisungen zur Authentifizierung gibt. Das könnte meine 401 Antwort mit Login-Anweisungen sein.

Antwort

4

Was Sie brauchen, ist ein AuthenticationEntryPoint Handler. Einfaches Beispiel:

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; 
} 
} 

Register Klasse als Service in services.xml Datei:

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

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

und eine kleine Änderung in security.yml Datei machen:

security: 
    firewalls: 
    somename: 
     entry_point: authentication_entry_point 
1

konnte ich Um den Standardeintragspunkt für den "Formular" -Typ unter der "API" -Firewall wie folgt zu überschreiben:

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

Dann ist es nur eine Frage der Umsetzung der AuthenticationEntryPointInterface:

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

Werfen Sie einen Blick auf die symfony Implementierung eine Vorstellung zu bekommen:

Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint 

Auch wahrscheinlich lohnt sich, die silex Auschecken Sicherheitsdienstanbieter, um zu sehen, wie sie das in "security.entry_point.form._proto" das Standardimplementieren injizieren.

Silex\Provider\SecurityServiceProvider