2016-05-03 23 views
1

Ich versuche Laravel mit einer externen Datenbank für die Authentifizierung zu verbinden, obwohl ich nicht sicher bin, wie es geht.Erweitern Laravel 5.2 Authentifizierung

Wie würde ich die Laravels-Authentifizierung erweitern, um eine benutzerdefinierte Anmeldemethode zu ermöglichen?

Die Datenbank ist auth und es verwendet username oder email mit Login, der Passwort-Hash ist sha512.

Was wäre der beste Weg?

Antwort

3

Verschiedene Datenbank:

Ich würde sagen, dass der beste Weg, dies zu tun, ist eine separate Verbindung für das jeweilige Modell zu definieren.

Fügen Sie in Ihrer database.php Konfiguration eine weitere Verbindung hinzu (nennen wir sie mysql_auth).

Um es in einem Modell zu verwenden, müssen Sie dies als eine Variable in der Klasse hinzuzufügen:

protected $connection = 'mysql_auth'; 

standardmäßig nun das Modell Anfragen Anfragen an genau diese Verbindung tun.

Nur als eine Notiz, um Migrationen zu erstellen, verwenden Sie Schema::connection('mysql_auth')->create(...).

Verschiedene Hashing-Methode:

Original: Um verschiedene Hash-Funktionen zu verwenden, müssen Sie im Grunde eine andere Klasse als Hash-Klasse verwenden.

Standardmäßig wird Hashing, wie in Providern definiert, hier ausgeführt: Illuminate\Hashing\HashServiceProvider::class. Um es zu ändern, werden Sie eine separate, andere Klasse als Anbieter erstellen müssen und diese Zeile ändern:

$this->app->singleton('hash', function() { 
    return new BcryptHasher; 
}); 

Nun wird diese dann verlinken auf Ihre Hashing-Klasse (das wird implementieren HasherContract-Schnittstelle), dass wird das sha512 (oder was auch immer) hashing machen.

Alles in allem, überprüfen Sie Illuminate\Hashing\HashServiceProvider, wie es die Hash-Methoden und Illuminate\Hashing\BcryptHasher für die Methoden, die Sie zum Implementieren Ihrer Hashing implementieren müssen registriert.

Update:

Kommentieren Sie Illuminate\Hashing\HashServiceProvider::class in Anbieter und fügen Sie so etwas wie \App\Providers\NewHashServiceProvider::class. Jetzt erstellen wir einen neuen Provider (app/Providers). Dies sollte funktionieren:

<?php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class NewHashServiceProvider extends ServiceProvider 
{ 
    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    protected $defer = true; 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('hash', function() { 
      return new \App\ShaHasher; 
     }); 
    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() 
    { 
     return ['hash']; 
    } 
} 

Das eigentlich unsere Hasher zurückkehrt, dass wir in einem Moment schaffen.

ShaHasher implementieren, erstellen Sie eine Klasse, die HasherContract (wie BcryptHasher der Fall ist) implementiert:

<?php 

namespace App; 

use RuntimeException; 
use Illuminate\Contracts\Hashing\Hasher as HasherContract; 

class ShaHasher implements HasherContract 
{ 
    /** 
    * Hash the given value. 
    * 
    * @param string $value 
    * @param array $options 
    * @return string 
    * 
    * @throws \RuntimeException 
    */ 
    public function make($value, array $options = []) 
    { 
     return hash('sha512',$value); 
    } 

    /** 
    * Check the given plain value against a hash. 
    * 
    * @param string $value 
    * @param string $hashedValue 
    * @param array $options 
    * @return bool 
    */ 
    public function check($value, $hashedValue, array $options = []) 
    { 
     if (strlen($hashedValue) === 0) { 
      return false; 
     } 

     return hash('sha512',$value) == $hashedValue 
    } 

    /** 
    * Check if the given hash has been hashed using the given options. 
    * 
    * @param string $hashedValue 
    * @param array $options 
    * @return bool 
    */ 
    public function needsRehash($hashedValue, array $options = []) 
    { 
     return false; 
    } 
} 
+0

Das 1 Problem löst, aber das Passwort anders als die Laravel Standard gehasht, ich muss zugeben, obwohl die Verbindung im Modell eine ziemlich nette Funktion ist – Ian

+0

ich mehr hinzugefügt haben Info zum Hashing-Teil der Frage. – Andrius

+0

Die sauberste Methode verwendet den 'HashServiceProvider' als @Andrius. Gute Idee. – codedge

0

Die neue Implementierung für SHA512 würde wahrscheinlich dann so etwas wie sein: Sie

namespace App; 

use Illuminate\Contracts\Hashing\Hasher; 

class Sha512Hasher implements Hasher 
{ 
    public function make($value, array $options = []) 
    { 

    } 

    public function check($value, $hashedValue, array $options = []) 
    { 

    } 

    public function needsRehash($hashedValue, array $options = []) 
    { 

    } 
} 

So im Wesentlichen unter Verwendung eines ServiceContractIlluminate\Contracts\Hashing\Hasher

diese Verwendung binden ein ServiceProvider:

class Sha512ServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register bindings in the container. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('hash', function() { 
     return new App\Sha512Hasher; 
    }); 

    } 
}