У меня есть таблица в моей базе данных с пользователями. Их пароль генерируется с помощью собственной пользовательской хэш-функции.
Как переопределить методы проверки подлинности в laravel 4 для использования моего собственного класса хеширования?
Это то, что я пытался сделать:
class CustomUserProvider implements Illuminate\Auth\UserProviderInterface { public function retrieveByID($identifier) { return $this->createModel()->newQuery()->find($identifier); } public function retrieveByCredentials(array $credentials) { // First we will add each credential element to the query as a where clause. // Then we can execute the query and, if we found a user, return it in a // Eloquent User "model" that will be utilized by the Guard instances. $query = $this->createModel()->newQuery(); foreach ($credentials as $key => $value) { if ( ! str_contains($key, 'password')) $query->where($key, $value); } return $query->first(); } public function validateCredentials(Illuminate\Auth\UserInterface $user, array $credentials) { $plain = $credentials['password']; return $this->hasher->check($plain, $user->getAuthPassword()); } } class CodeIgniter extends Illuminate\Auth\Guard { } App::bind('Illuminate\Auth\UserProviderInterface', 'CustomUserProvider'); Auth::extend('codeigniter', function() { return new CodeIgniter( App::make('CustomUserProvider'), App::make('session')); });
Когда я запускаю метод Auth :: try, я получаю эту ошибку: ErrorException: Warning: тип незаконного смещения в isset или пустой в G: \ Dropbox \ Workspaces \ www \ video \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Application .php строка 352
Вот как это удалось решить проблему:
библиотеки \ CustomHasherServiceProvider.php
use Illuminate\Support\ServiceProvider; class CustomHasherServiceProvider extends ServiceProvider { public function register() { $this->app->bind('hash', function() { return new CustomHasher; }); } }
библиотеки \ CustomHasher.php
class CustomHasher implements Illuminate\Hashing\HasherInterface { private $NUMBER_OF_ROUNDS = '$5$rounds=7331$'; public function make($value, array $options = array()) { $salt = uniqid(); $hash = crypt($password, $this->NUMBER_OF_ROUNDS . $salt); return substr($hash, 15); } public function check($value, $hashedValue, array $options = array()) { return $this->NUMBER_OF_ROUNDS . $hashedValue === crypt($value, $this->NUMBER_OF_ROUNDS . $hashedValue); } }
И затем я заменил «Illuminate \ Hashing \ HashServiceProvider» на «CustomHasherServiceProvider» в массиве поставщиков в app / config / app.php
и добавлено «приложение / библиотеки» для автозагрузки classmap в composer.json
@vFragosop был на правильном пути с расширением Auth
.
Есть несколько способов скинуть кошку, и вот как я буду делать это, не заменяя класс Hasher
по умолчанию:
Включите в app/routes.php
или где угодно:
use Illuminate\Auth\Guard; Auth::extend("eloquent", function() { return new Guard( new \Illuminate\Auth\EloquentUserProvider(new CustomHasher(), "User"), App::make('session.store') ); });
Создание и автозагрузка класса CustomHasher
(например, app/libraries/CustomHasher.php
):
class CustomHasher extends Illuminate\Hashing\BcryptHasher { public function make($value, array $options = array()) { ... } public function check($value, $hashedValue, array $options = array()) { ... } }
Вот и все.
Предупреждение: я не могу гарантировать, что это работает из коробки, и здесь может быть несколько ошибок. Имейте в виду, что Laravel 4 все еще находится на стадии разработки. Хотел бы я дать более точный ответ, но кодовая база по-прежнему переживает множество изменений, и не все правильно документировано. В любом случае, вы ищете что-то вроде этого:
// on config/auth.php 'driver' => 'custom'
// on start/global.php Auth::extend('custom', function() { // CustomUserProvider is your custom driver and should // implement Illuminate\Auth\UserProviderInterface; return new Guard(new CustomUserProvider, App::make('session')); });
Если это не дает вам достаточной информации для начала, вы должны понять это, взглянув на эти классы ниже:
EloquentUserProvider и DatabaseUserProvider
Эти классы являются поддерживаемыми в настоящее время драйверами проверки подлинности. Они должны помочь вам создать свой CustomUserProvider
(или любое CustomUserProvider
имя, которое вам нравится на самом деле).
Менеджер
Это базовый класс для всего, что принимает пользовательские драйверы (включая AuthManager ). Он предоставляет методы для их регистрации, как в Laravel 3.