Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 18.09.2017 17:24:04

Как перенести сайт с кастомной авторизацией на 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)

Не в сети

#2 19.09.2017 07:30:07

Re: Как перенести сайт с кастомной авторизацией на laravel

у меня в одном проекте была старая база пользователей с паролями в двойном 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' => [
        // …
    ],
];

Не в сети

Подвал раздела