Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Есть некоторый самописный сайт, написанный более пяти лет назад.
И появилась задача перевести его на laravel.
Возникает вот какой вопрос: можно ли сделать плавным и постепенным переход пользователей на движок laravel?
Что я под этим понимаю. Разрабатывается сайт на laravel. В базе данных к таблице users добавляются поля из прошлой системы (допустим, password_old и password_hash_old) и создаётся какой-нибудь булев признак типа is_laravel_user. В момент переноса сайта на новый движок (работы в выходной день, можно остановить на час-другой) заливаются данные по пользователям из старой системы.
Пользователь имеет возможность войти по старому паролю (если у него установлен is_laravel_user = false), при этом его текущий пароль сохраняется в формате laravel и проставляется is_laravel_user = true (Ну или как-то иначе может выглядеть вход в систему для старых пользователей: например отдельная страница, где проверяется старый логин/пароль и предлагается создать новый, уже для laravel)
(Разумеется, известна функция из старого движка, которая по заданным password_old и password_hash_old может проверить входной пароль. Входа по соц. сеткам типа вконтакте в предыдущем движке не было, а в laravel позже можно будет прикрутить)
Дальше пользователи с is_laravel_user = true входят уже по механизму авторизации laravel. А когда (через полгода-год), когда все пользователи перейдут на новые пароли -- можно отпиливать этот механизм.
В какую сторону раскапывать подобную задачу? Если ли какие-то готовые статьи? Есть ли мысли, как более просто организовать подобный переход.
В документации я нашёл упоминание Custom guards и custom auth providers. Не совсем понятно, как это совместить с обычной системой авторизации.
Изменено aksis (18.09.2017 17:34:47)
Не в сети
у меня в одном проекте была старая база пользователей с паролями в двойном md5, делается это примерно так
в app/Providers/AppServiceProvider.php в register() добавляем
$this->app['auth']->provider('myprov', function () {
return new \App\Services\MyUserProvider;
});
в app/Services/MyUserProvider.php:
<?php
namespace App\Services;
use App\User;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Support\Str;
class MyUserProvider extends EloquentUserProvider
{
public function __construct()
{
parent::__construct(new MD5Hashing(), User::class);
}
public function retrieveByCredentials(array $credentials)
{
$query = $this->createModel()->newQuery();
foreach ($credentials as $key => $value) {
if (!Str::contains($key, 'password')) {
$query->where($key, $value);
} else {
$query->where($key, $this->hasher->make($value));
}
}
return $query->first();
}
}
остаётся добавить хэшер app/Services/MD5Hashing.php:
<?php
namespace App\Services;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
/**
* Class MD5Hashing - крайне ненадёжное шифрование для паролей, не надо так делать
*
* @package App\Services
*/
class MD5Hashing implements HasherContract
{
/**
* Hash the given value.
*
* @param string $value
* @param array $options
* @return string
*/
public function make($value, array $options = [])
{
$hash = md5(md5($value));
return $hash;
}
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function check($value, $hashedValue, array $options = [])
{
if (strlen($hashedValue) === 0) {
return false;
}
return $this->make($value, $options) === $hashedValue;
}
/**
* Check if the given hash has been hashed using the given options.
*
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function needsRehash($hashedValue, array $options = [])
{
return false;
}
}
остаётся подключить этого провайдера в конфиге auth.php, примерно так:
return [
'defaults' => [
'guard' => 'web',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'myprov',
'model' => App\User::class,
],
],
'passwords' => [
// …
],
];
Не в сети