Подтвердить что ты не робот

Приложение Laravel 5 Multi-Tenancy с отдельными базами данных - пользователи имеют доступ к нескольким установкам

За последние пару лет я разработал очень настроенное приложение PHP/MySQL, которое используется для нескольких клиентов. Я создаю новую базу данных и новую установку для каждого клиента до этого момента.

Первая очевидная проблема заключается в том, что обновление нескольких установок происходит с любыми изменениями кода; Вторая проблема заключается в том, что каждая установка имеет большое количество пользователей; и для большинства клиентов; некоторые из этих пользователей одинаковы - и они должны иметь несколько отдельных учетных записей пользователей и URL-адресов, которые нужно запомнить.

Я переношу приложение на Laravel 5 на данный момент и рассматриваю лучшую реализацию для многопользовательской аренды; поэтому вы ищете небольшой совет по наилучшей реализации. Раньше я использовал Laravel, но я не эксперт.

Это то, что я думаю о настройке.

1 Основная база данных, которая содержит таблицы для:

  • Вся информация об учетной записи пользователя
  • Таблица контроля доступа - какие установки доступны пользователям; что их уровень пользователя на этой установке.
  • Таблица конфигурации для каждой установки - информация о подключении базы данных, базовая конфигурация и т.д.

Затем отдельная база данных для каждой установки, которая содержит всю информацию, необходимую для этой установки и отправленную ей.

Идеальная настройка заключается в том, что пользователь может перейти к субдомену i.e installationname.appname.com; войдите в систему с данными своего главного входа и автоматически перейдите к необходимой установке; ИЛИ зайдите в appname.com, войдите в систему, а затем выберите, к какой установке подключиться.

Мои вопросы:

  • Это лучшее соглашение для достижения того, что я ищу.
  • Какой лучший способ для хранения какой установки пользователь ищет (переменная сеанса)
  • Могу ли я определить модель между двумя базами данных - возможно, определите одно соединение в качестве основного соединения, а затем динамически определите другое соединение, используя информацию о соединении с базой данных в основной базе данных, чтобы подключиться к правильной установке. - система часто должна проверять информацию пользователя для уровня доступа и т.д.

Я уверен, что есть много проблем, о которых я не думал; но если у кого есть какие-либо ссылки или руководства, которые могут помочь, это будет здорово. Первый раз, задавая вопрос о SO, но нашел в прошлом огромное количество исследований, поэтому благодаря сообществу!


ОБНОВЛЕНИЕ. Поэтому я думаю, что у меня есть способ сделать эту работу сейчас; используя отдельные базы данных, как указано выше; set

protected $connection = 'tenant_connection'

в моделях, относящихся к содержимому базы данных, специфичной для арендатора.

Затем где-то в файле заголовка устанавливается доступное tenant_connection на основе переменной сеанса, которая была установлена ​​в login/by subdomain.

$tenant = Installation::where('installation', '=', $session['installation'])->first();
Config::set('database.connections.tenant_connection', array('driver' => 'mysql', 'host' => $tenant->db_hostname, 'username' => $tenant->db_username)... etc.

Предполагая, что отношения будут работать через соединения; Я не понимаю, почему это не сработает; просто нужно разработать лучшее место для установки подключения арендатора.

4b9b3361

Ответ 1

Трудно ответить на большинство ваших вопросов - поскольку это характерно для вашего приложения и мнения.

Но один бит, на который я могу ответить, - это разные модели, которые могут иметь разные подключения к базе данных. Таким образом, ваша модель user использует стандартное соединение по умолчанию - но ваши другие модели могут использовать другое соединение:

class Example extends Model {

    protected $connection= 'second_db_connection';

}

Затем в вашем файле подключения к DB - у вас будет что-то вроде этого:

return array(
    'connections' => array(
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        'second_db_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),

Ответ 2

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

У меня тогда было два соединения: mysql и mysql_tenant; где база данных mysql_tenant не задана, а динамически.

Модель User, Installations и mappings использует соединение mysql, все остальные используют mysql_tenant

Создал код для каждой установки и использовал его как имя базы данных арендатора; сохраняя этот код в сеансе.

Используется промежуточное ПО MultiTenant для управления переключением между установками с использованием этих ключевых строк:

$tenant_id = session()->get('tenant');

\Config::set('database.connections.mysql_tenant.database', $dbname);
\DB::setDefaultConnection('mysql_tenant');

Там много больше для создания метода для переключения и т.д., но это суть.

Ответ 3

Laravel 5 достаточно продвинутый, чтобы вы могли иметь только одну установку вместе со стратегической базой данных с четко определенными отношениями и ключами. Редко бывает необходимость в нескольких базах данных.

Если вы можете уточнить свои требования, я могу предоставить более конкретный ответ.