Это был лучший результат в Google, но этих ответов недостаточно для любого пользователя Laravel 5. Даже документации недостаточно.
Я успешно заменил Hasher только для 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 и Providers. Я еще не удосужился узнать, что именно делают охранники, но, похоже, они обеспечивают соблюдение требований аутентификации. Провайдеры несут ответственность за предоставление необходимой информации охранникам. Следовательно, Guard требует Provider. Вы можете видеть, что в конфигурации по умолчанию guards.web.provider
отображается на providers.users
.
Laravel по умолчанию предоставляет две реализации UserProvider
: EloquentUserProvider
и DatabaseUserProvider
. Они соответствуют двум возможным значениям для providers.users.driver
: eloquent
и database
соответственно. Обычно выбирается вариант eloquent
. EloquentUserProvider
нужен Hasher
, поэтому Laravel дает ему стандартную реализацию (т.е. BcryptHasher
). Мы переопределяем это поведение, создавая собственный «драйвер» для создания экземпляра Provider.
Auth
— фасад нашего дружелюбного соседства. Его поддерживает AuthManager
. Часто предлагаемый метод Auth::extend()
ожидает Guard
(вопреки тому, что может быть предложено в документации). Нам незачем связываться с Гвардией. Вместо этого мы можем использовать Auth::provider()
, который в основном делает то же самое, что и extend()
, за исключением того, что он ожидает Provider. Поэтому мы предоставляем функцию для создания нашего собственного экземпляра EloquentUserProvider
, присваивая ему наш пользовательский хэшер (например, MyCustomHasher
). Мы также включаем «имя» драйвера, которое можно использовать в файле конфигурации.
Теперь вернемся к файлу конфигурации. Только что созданное имя драйвера является допустимым значением для providers.users.driver
. Установите его там, и все готово!
Я надеюсь, что все это имеет смысл и полезно для кого-то!
person
musicin3d
schedule
22.01.2019