Переопределить методы аутентификации laravel 4 для использования пользовательской функции hasing

130
13

У меня есть таблица в моей базе данных с пользователями. Их пароль генерируется с помощью собственной пользовательской хэш-функции.


Как переопределить методы проверки подлинности в 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: предупреждение: неправильный тип смещения в isset или пустой в G:\Dropbox\Workspaces\www\video\vendor\laravel\framework\src\Illuminate\Foundation\Application.php строка 352

спросил(а) 2021-01-19T18:03:23+03:00 2 месяца, 3 недели назад
1
Решение
172

Вот как это удалось решить проблему:


библиотеки \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

ответил(а) 2021-01-19T18:03:23+03:00 2 месяца, 3 недели назад
97

@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())
{
...
}
}

Что это.

ответил(а) 2021-01-19T18:03:23+03:00 2 месяца, 3 недели назад
62

Предупреждение: Я не могу гарантировать, что это работает из коробки, и здесь может быть несколько ошибок. Имейте в виду, что 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 (или любое другое имя, которое вам нравится на самом деле).


Manager

Это базовый класс для всего, что принимает пользовательские драйверы (включая AuthManager). Он предоставляет методы для их регистрации, как в Laravel 3.

ответил(а) 2021-01-19T18:03:23+03:00 2 месяца, 3 недели назад
44

Это был лучший результат в Google, но эти ответы недостаточны ни для кого на Laravel 5. Даже документации недостаточно.

Я успешно заменил хэшер только для UserProvider. Остальная часть моего приложения продолжает использовать очень хороший BcryptHasher, в то время как аутентификация пользователя использует пользовательский хеш. Для этого мне пришлось изучить эти ответы, документацию и сам исходный код Laravel. Вот что я нашел. Надеюсь, я смогу спасти кого-то еще на полную голову. Не стесняйтесь ставить это к вопросу о Laravel 5.

Сначала создайте свой собственный хеш, если вы этого еще не сделали. Разместите его там, где вы хотите.

class MyCustomHasher implements Hasher {

public function make($value, array $options = []) {
return md5( $value ); // PLEASE DON'T USE MD5!
}

public function check($value, $hashedValue, array $options = []) {
if (strlen($hashedValue) === 0) {
return false;
}
return $hashedValue === $this->make($value);
}

public function needsRehash($hashedValue, array $options = []) {
return false;
}

}

Отредактируйте любой зарегистрированный ServiceProvider следующим образом...

class AppServiceProvider extends ServiceProvider {

public function boot() {
Auth::provider('eloquentCustom', function ($app, $config) {
return new EloquentUserProvider(new MyCustomHasher(), $config['model']);
});
}

}

Вы можете заменить 'eloquentCustom' что вы предпочитаете.

Наконец, отредактируйте ваш config/auth.php чтобы использовать ваш собственный провайдер. Вот соответствующие части...

return [

// ...

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
// ...
],

// ...

'providers' => [
'users' => [
'driver' => 'eloquentCustom', // <--- This is the only change
'model' => App\User::class,
],
// ...
],

// ...

];

Вот небольшое объяснение, потому что я не могу поверить, насколько это было неясно.

Как и следовало ожидать, аутентификация настраивается с помощью config/auth.php. Есть две ключевые части: охранники и провайдеры. Я еще не удосужился узнать, что конкретно делают охранники, но они, похоже, обеспечивают соблюдение требований аутентификации. Поставщики несут ответственность за предоставление необходимой информации охранникам. Поэтому для охраны требуется Провайдер. Вы можете видеть, что в конфигурации по умолчанию guards.web.provider сопоставлен с providers.users.

Laravel по умолчанию предоставляет две реализации UserProvider: EloquentUserProvider и DatabaseUserProvider. Они соответствуют двум возможным значениям для providers.users.driver: eloquent и database, соответственно. Обычно выбирается eloquent вариант. EloquentUserProvider нужен Hasher, поэтому Laravel дает его независимо от стандартной реализации (т. BcryptHasher). Мы переопределяем это поведение, создавая наш собственный "драйвер" для создания провайдера.

Auth это наш дружелюбный фасад соседства. Он поддерживается AuthManager. Часто предлагаемый метод Auth::extend() ожидает Guard (вопреки тому, что может предложить документация). Нам не нужно связываться с гвардией. Вместо этого мы можем использовать Auth::provider() который в основном делает то же самое, что и extend(), за исключением того, что он ожидает поставщика. Поэтому мы предоставляем функцию для создания нашего собственного экземпляра EloquentUserProvider, предоставляя ему наш собственный Hasher (например, MyCustomHasher). Мы также включаем "имя" драйвера, которое можно использовать в файле конфигурации.

Теперь вернемся к файлу конфигурации. Это имя драйвера, которое мы только что создали, теперь является допустимым значением для providers.users.driver. Установите его там, и все готово!

Я надеюсь, что все это имеет смысл и полезно для кого-то!

ответил(а) 2021-01-19T18:03:23+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема