2016-06-09 8 views
0

Ich schreibe gerade einen Test, um sicherzustellen, dass unser CSRF-Schutz in Laravel funktioniert. Der Test sieht so aus.Laravel PHPUnit übergibt immer CSRF

public function testSecurityIncorrectCSRF() 
{ 
    $this->visit('/login') 
    ->type('REDACTED', 'email') 
    ->type('123123', 'password'); 

    session()->regenerateToken(); 

    $this->press('login') 
    ->seePageIs('/login'); 
} 

Egal was ich tue, und selbst wenn ich eine falsche _token passieren, wird der Login-Anfrage immer erfolgreich. Ich habe es außerhalb des PHPUnit-Tests versucht und dort funktioniert der CSRF-Schutz. Alle meine Middlewares sind aktiviert, daher sollte der CSRF-Schutz aktiviert sein.

Kann jemand erklären, warum das passiert?

+0

Haben Sie den Standard geändert 'App \ Http \ kernel.php' Datei und bewegten das' web 'Middleware woanders? – Ohgodwhy

+0

'protected $ middlewareGroups = [ 'web' => [ \ Illuminate \ Session \ Middleware \ StartSession :: Klasse, \ App \ Http \ Middleware \ VerifyCsrfToken :: Klasse, ]]' – Hedam

+0

Es ist im Grunde das ursprüngliche Kernel , nur mit einigen zusätzlichen Middlewares – Hedam

Antwort

3

Werfen Sie einen Blick auf die Illuminate\Foundation\Http\Middleware\VerifyCsrfToken Klasse, vor allem die handle Methode.

public function handle($request, Closure $next) 
{ 
    if (
     $this->isReading($request) || 
     $this->runningUnitTests() || 
     $this->shouldPassThrough($request) || 
     $this->tokensMatch($request) 
    ) { 
     return $this->addCookieToResponse($request, $next($request)); 
    } 

    throw new TokenMismatchException; 
} 

Es geht immer die csrf Token zu überprüfen, ob es feststellt, dass die Anforderung von einem Unit-Test kommt: $this->runningUnitTests()