2013-12-14 12 views
7

Ich kann nicht scheinen, Sentry Arbeit zu bekommen. Ich bekomme diesen Fehler immer wieder: A hasher has not been provided for the user. Weiß jemand, was würde das passieren?Ein Hasher wurde nicht für den Benutzer zur Verfügung gestellt

The error log

Ich bin mit MAMP auf OS X 10.9. Ich benutze PHP 5.4.4 MCrypt ist installiert und aktiviert. Dieser Fehler tritt bei dem Versuch auf, das Kennwort beim Erstellen eines neuen Benutzers zu hashen. Unser Projekt verwendet das Laravel Sentry Plugin. Hier ist die Steuerung:

<?php 

use Auth, BaseController, Form, Input, Redirect, Sentry, View; 

class AuthController extends BaseController { 

     public function register() 
     { 
      return View::make('Auth.register'); 
     } 

     public function handleRegister() 
     { 
       $validator = Validator::make(Input::all(), User::$rules); 

       if ($validator->passes()) { 
        //The registration has passed, create a user 

      $user = new User; 
        $user->first_name = Input::get('first_name'); 
        $user->last_name = Input::get('last_name'); 
        $user->email = Input::get('email'); 
        $user->password = Hash::make(Input::get('password')); 
        $user->activated = 1; 
        $user->save(); 

      //grabbing the Sentry model of the user so we can save it to the appropriate group 
      $sentryUser = Sentry::findUserByLogin($user->email); 

      if (Input::get('userType') == 'Promoter') 
      { 
       $group = 'Promoters'; 
      } 
      else 
      { 
       $group = 'Agents'; 
      } 

      // Find the group using the group id 
      $group = Sentry::findGroupByName($group); 

      // Assign the group to the user 
      $sentryUser->addGroup($group); 

        return Redirect::action('[email protected]')->with('message', 'Thanks for registering!'); 
       } else { 
       // validation has failed, display error messages 
        return Redirect::action('[email protected]')->with('message', 'The following errors occurred')->withErrors($validator)->withInput(); 

       } 
     } 

     /** 
     * Display the login page 
     * @return View 
     */ 
     public function login() 
     { 
       return View::make('Auth.login'); 
     } 

     /** 
     * Login action 
     * @return Redirect 
     */ 
     public function handleLogin() 
     { 
       $credentials = array(
         'email' => Input::get('email'), 
         'password' => Input::get('password') 
       ); 

       try 
       { 
         $user = Sentry::authenticate($credentials, false); 

         if ($user) 
         { 
           return Redirect::action('[email protected]'); 
         } 
       } 
       catch(\Exception $e) 
       { 
         return Redirect::action('[email protected]')->withErrors(array('login' => $e->getMessage())); 
       } 
     } 

     /** 
     * Logout action 
     * @return Redirect 
     */ 
     public function logout() 
     { 
       Sentry::logout(); 

       return Redirect::action('[email protected]')->with('message','You have been logged out'); 
     } 

} 

?> 
+0

möglich Duplikat [Sentry2 Benutzermodellerweiterung] (http://stackoverflow.com/questions/16655070/sentry2-user-model-extension) – Ifnot

Antwort

13

Das Problem ist, wenn Sie Sentry konfigurierten User.php als Modell zu verwenden, um den Sentry Hasher verliert. Die Lösung ist die Hasher zu setzen, wenn ein Benutzer

$user->setHasher(new Cartalyst\Sentry\Hashing\NativeHasher); 
+2

Wow, Sie sind ein Profi. Warum vielen Dank für diese schöne Erklärung. Ich werde Sie so schnell wie möglich markieren (2 Minuten);) – jamespick

4

Eine bessere Alternative zu @Dylan Pierce Vorschlag registriert ist, die Hasher direkt im Konstruktor Ihres Benutzermodell einzustellen.

public function __construct() 
{ 
    $this->setHasher(new \Cartalyst\Sentry\Hashing\NativeHasher); 
} 

Note gibt es verschiedene andere Hashers von Sentry zur Verfügung gestellt und Sie können sie in diesem Verzeichnis: vendor/cartalyst/sentry/src/Cartalyst/Sentry/Hashing/

Voll Beispiel:

use Cartalyst\Sentry\Users\Eloquent\User; 
use Cartalyst\Sentry\Hashing\NativeHasher as SentryNativeHasher; 

class Subscriber extends User 
{ 

    public function __construct() 
    { 
      $this->setHasher(new SentryNativeHasher); 
    } 

} 
+2

Nachdem ich mehr Erfahrung gesammelt habe, muss ich zustimmen, dass dies eine bessere Antwort ist. –

2

Wenn Sie die setHasher Methode verwenden möchten für das gesamte Modell; um die Eloquent Klassenkonstruktors Funktion, können die statische Methode ‚boot‘ zu erhalten, die von der Eloquent Konstruktor Klasse ausgeführt werden:

public static function boot() 
{ 
    static::setHasher(new \Cartalyst\Sentry\Hashing\NativeHasher); 
} 
+0

Sie möchten in der Funktion parent :: boot() aufrufen – developerbmw

1

Die beste Methode, um die Eloquent Boot-Funktion zu verwenden ist (wie von @browno vorgeschlagen), sondern auch den Hasher der übergeordneten Klasse verwenden, sodass die Sentry-Konfigurationseinstellung für den Hasher weiterhin verwendet wird. Denken Sie auch daran, die Eltern-Boot-Funktion aufzurufen, sonst wird es wahrscheinlich Dinge brechen. Beispielcode:

use Cartalyst\Sentry\Users\Eloquent\User as SentryUser; 

class User extends SentryUser { 
    protected static function boot() { 
     parent::boot(); 

     static::setHasher(parent::getHasher()); 
    } 
} 
Verwandte Themen