我似乎无法让哨兵工作。我一直收到这个错误:A hasher has not been provided for the user.
有谁知道会发生什么事情?
我在OS X 10.9上运行MAMP。 我使用的是PHP 5.4.4 已安装并启用MCrypt。 尝试在创建新用户时散列密码时会发生此错误。 我们的项目使用laravel Sentry插件。 这是控制器:
<?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('AuthController@login')->with('message', 'Thanks for registering!');
} else {
// validation has failed, display error messages
return Redirect::action('AuthController@register')->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('OfferController@offer');
}
}
catch(\Exception $e)
{
return Redirect::action('AuthController@login')->withErrors(array('login' => $e->getMessage()));
}
}
/**
* Logout action
* @return Redirect
*/
public function logout()
{
Sentry::logout();
return Redirect::action('AuthController@login')->with('message','You have been logged out');
}
}
?>
答案 0 :(得分:13)
问题是,当您将Sentry配置为使用User.php作为模型时,它会丢失Sentry hasher。解决方案是在用户注册时设置哈希
$user->setHasher(new Cartalyst\Sentry\Hashing\NativeHasher);
答案 1 :(得分:4)
@Dylan Pierce建议的更好的替代方法是直接在用户模型的构造函数中设置哈希。
public function __construct()
{
$this->setHasher(new \Cartalyst\Sentry\Hashing\NativeHasher);
}
请注意Sentry提供了其他不同的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方法;为了保留Eloquent类的构造函数,使用静态方法'boot',它将从Eloquent构造函数类运行:
public static function boot()
{
static::setHasher(new \Cartalyst\Sentry\Hashing\NativeHasher);
}
答案 3 :(得分:1)
最好的方法是使用Eloquent启动功能(如@browno所示),但也使用父类的hasher,因此仍将使用hasher的Sentry配置设置。另外,请记住调用父启动功能,否则可能会破坏功能。示例代码:
use Cartalyst\Sentry\Users\Eloquent\User as SentryUser;
class User extends SentryUser {
protected static function boot() {
parent::boot();
static::setHasher(parent::getHasher());
}
}