0

Problem: Ich muss eine Basisauthentifizierung für meine mit Laravel 5.4 erstellte API implementieren. Da wir es ohne eine Datenbank implementieren müssen (nur Anmeldeinformationen von config() bekommen) habe ich versucht, eine registrierte Middleware wie folgt zu erstellen:Laravel 5.4 Standardauthentifizierung ohne Datenbank

<?php 

namespace App\Http\Middleware; 

class AuthenticateOnceWithBasicAuth 
{ 
    public function handle($request, $next) 
    { 
     if($request->getUser() != conf('auth.credentials.user') && $request->getPassword() != conf('auth.credentials.pass')) { 
      $headers = array('WWW-Authenticate' => 'Basic'); 
      return response('Unauthorized', 401, $headers); 
     } 
     return $next($request); 
    } 
} 

Es funktioniert, aber diese Art und Weise kann ich nur einen Berechtigungsnachweis für die ganze API. Ich habe versucht, mehr als eine Anmeldeinformationen in der Konfiguration zu erstellen, Benutzer und Kennwort von der Anforderung zu speichern, aber auf diese Weise funktioniert es wie grundlegende Authentifizierung deaktiviert ist.

Frage: gibt es einen Weg, dies zu erreichen? Wie kann ich mehrere Anmeldeinformationen in meiner Konfigurationsdatei haben, ohne eine Datenbank zu verwenden?

+0

Es gibt ein Problem mit diesem Code! Sie geben 401 nur zurück, wenn Benutzername und Kennwort nicht übereinstimmen. Wenn ein Benutzer einen gültigen Benutzernamen, aber ein ungültiges Passwort angibt, wird er authentifiziert. Du solltest || benutzen anstelle von && – fhugas

Antwort

2

Sie können Ihre autorisierten Benutzernamen und Ihr Passwort in Ihrer Konfigurationsdatei als Sammlung speichern.

config/myconfig.php

return [ 
     'authorized_identities' => collect([ 
      ['user1','password1'], 
      ['user2','password2'], 
      ... 
     ]), 
]; 

und dann in Ihrer Middleware

if(config('myconfig.authorized_identites')->contains([$request->getUser(),$request->getPassword()])) 
+0

Perfekt funktioniert, danke! – abierto

+0

Eine andere Möglichkeit ist es, es in ein Singleton zu setzen. – Alex

0

Sie können ein Array von Anmeldeinformationen haben und versuchen, die Eingabe mit jedem von ihnen zu vergleichen und zu validieren. Um ehrlich zu sein, könnte man dies leicht mit einer SQLite-Datenbank implementieren. Es erfordert minimalistisches Setup und Sie können es innerhalb von 5 Minuten starten und verwenden.

+0

könnte es der Fall sein, wo er auch keine sqlite db verwenden kann, da dies sqlite3 erfordert. Aber ich stimme dem Array-Ansatz zu, sollte einfach genug sein. – oBo