2013-12-14 9 views
7

मुझे कामकाजी काम नहीं लग रहा है। मुझे यह त्रुटि मिल रही है: A hasher has not been provided for the user. क्या किसी को पता है कि यह क्या होगा?उपयोगकर्ता के लिए एक हैशर प्रदान नहीं किया गया है

The error log

मैं ओएस एक्स 10.9 पर MAMP चल रहा हूँ। मैं php 5.4.4 का उपयोग कर रहा हूं MCrypt स्थापित और सक्षम है। यह त्रुटि तब होती है जब कोई नया उपयोगकर्ता बनाते समय पासवर्ड हैश करने का प्रयास करता है। हमारी परियोजना लार्वाले सेंट्री प्लगइन का उपयोग करती है।

<?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

[Sentry2 उपयोगकर्ता मॉडल एक्सटेंशन] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/16655070/sentry2-user-model-extension) – Ifnot

उत्तर

13

समस्या है जब आप संतरी के लिए कॉन्फ़िगर अपने मॉडल यह संतरी क़मी बनाने की मशीन के रूप में खो देता है User.php उपयोग करने के लिए है: यहाँ नियंत्रक है। समाधान जब कोई उपयोगकर्ता

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

वाह, आप एक समर्थक रहे हैं। इस खूबसूरत स्पष्टीकरण के लिए धन्यवाद क्यों। जैसे ही मैं कर सकता हूं (2 मिनट); मैं – jamespick

4

दर्ज की है @Dylan पियर्स सुझाव के लिए एक बेहतर विकल्प अपने उपयोगकर्ता मॉडल के निर्माता में सीधे क़मी बनाने की मशीन स्थापित करने के लिए है क़मी बनाने की मशीन स्थापित करने के लिए है।

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

टिप्पणी वहाँ अन्य विभिन्न संतरी द्वारा प्रदान की Hashers कर रहे हैं और आप उन्हें इस निर्देशिका में पा सकते हैं: vendor/cartalyst/sentry/src/Cartalyst/Sentry/Hashing/

पूर्ण उदाहरण:

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

अधिक अनुभव प्रोग्रामिंग एकत्र करने के बाद मुझे यह मानना ​​होगा कि यह एक बेहतर जवाब है। –

2

आप के लिए setHasher विधि का उपयोग करना चाहते हैं पूरा मॉडल; आदेश सुवक्ता वर्ग निर्माता समारोह को संरक्षित करने में, स्थैतिक विधि 'बूट' जो सुवक्ता निर्माता वर्ग से चलाया जाएगा का उपयोग करें:

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

आप फ़ंक्शन के अंदर पैरेंट :: बूट() को कॉल करना चाहते हैं – developerbmw

1

सबसे अच्छा तरीका सुवक्ता बूट समारोह (उपयोग करने के लिए के रूप में @browno ने सुझाव दिया है), लेकिन पैरेंट क्लास से हैशर का भी उपयोग करें, इसलिए हैशर के लिए सेंट्री कॉन्फ़िगरेशन सेटिंग अभी भी उपयोग की जाएगी। साथ ही, पैरेंट बूट फ़ंक्शन को कॉल करना याद रखें, अन्यथा यह चीजों को तोड़ने की संभावना है। उदाहरण कोड:

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

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

     static::setHasher(parent::getHasher()); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे