Я пытаюсь взломать несколько приложений с несколькими базами данных с использованием laravel. Пройдя много статей в Интернете, я теперь понимаю, что существуют разные подходы к архитектуре базы данных.Mutli аренда приложений в laravel 5?
- Чтобы иметь единую базу данных и иметь
tenant_id
внешний ключ, чтобы отделить арендатор запись - Чтобы иметь несколько баз данных для разделения данных каждого арендатора
проекта я работаю над требует, чтобы каждый арендатор имеет его собственную базу данных для целей безопасности. Теперь я пытаюсь вручную взломать установку Laravel 5 для достижения этого, но я не профессионал, и я вижу некоторые неудачи.
Итак, я начал с создания миграции для основной БД, которая будет хранить всех арендаторов. Я создал эту миграцию в папке с именем main
в папке миграции. Схема выглядит так:
Schema::create('tenants', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('description');
$table->string('logo');
$table->string('username');
$table->timestamps();
});
Тогда я пошел вперед и создал миграции файлы для баз данных арендатора, и я поместил их в tenants
папке внутри папки кочевок. Схема выглядит так:
пользователей Таблица:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
Роль таблица:
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->sting('name');
$table->timestamps();
});
И шарнир между ними:
Schema::create('role_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('role_id')->unsigned();
$table->foreign('role_id')->refernces('id')->on('roles');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->refernces('id')->on('users');
$table->timestamps();
});
В этот момент я начал с файлы семян, которые создавали бы несколько поддельных арендаторов, а затем для каждого арендатора выполняли миграцию для создания базы данных арендатора как таковые. Файл Семя выглядит так:
public function run()
{
$faker = Faker::create();
// Fetching all tenants
$tenants = App\Tenant::all();
// Deleting their databases
$tenants->each(function($tenant){
DB::statement('DROP DATABASE IF EXISTS ' . $tenant->username);
DB::statement('DROP USER IF EXISTS ' . $tenant->username);
});
// Truncating the tenants table itself
DB::table('tenants')->truncate();
for($i = 0; $i < 3; $i++){
$company = $faker->company();
$description = $faker->text();
$logo = $faker->imageUrl(50, 50);
$username = str_random(20);
Tenant::create([
'name' => $company,
'description' => $description,
'logo' => $logo,
'username' => $username,
]);
// Creating a new user by the username of the tenant
// Also giving him privileges on the database by the same name
DB::statement("CREATE USER " . $username . "@'localhost' IDENTIFIED BY 'admin12345';");
DB::statement("GRANT ALL PRIVILEGES ON *.* TO " . $username . "@'localhost';");
DB::statement('CREATE DATABASE ' . $username);
// Todo: Save these database credentials somewhere
// Todo: Run migration on the databases created
}
}
В этот момент я запутался, как хранить учетные данные БД для каждого пользователя? Я имею в виду, что сейчас я жестко кодирую пароль для каждой базы данных, но это скоро изменится, и каждый пользователь будет иметь уникальный пароль. Так хорошо ли хранить пароль в основной базе данных? Я имею в виду, что я могу зашифровать и сохранить его, а затем, когда мне нужно подключиться к БД, я могу взять имя пользователя арендатора и расшифрованный пароль для подключения к БД. Это хороший подход?
Кроме этого, я также смущен тем, как динамически подключаться к БД и выполнять миграции для таблиц арендаторов. Я знаю, что я могу вызвать команды artisan для запуска миграции, но как сначала подключиться к БД?
Я также смущен как о том, как проверить, какой пользователь вошел в систему. Я имею в виду, что у каждого арендатора есть свои собственные пользователи. Поэтому, когда пользователь входит в систему, я также спрашиваю их имя пользователя-арендатора, чтобы я знал, к какой базе данных подключается и затем аутентифицирует их в таблице users.
Но опять же я смущен, что если я нахожусь на правильном пути с таким подходом?
Так что моя главная проблема сейчас - подключиться к другой базе данных динамически. Как мне это сделать?
Я согласен с @RiggsFolly , но если вам действительно нужна эта структура, я думаю, вы можете изменить настройки приложения/config/database.php usin g в классе Config, поэтому для изменения вашей базы данных вы должны выполнить Config :: set ('database.default', 'sqlite'); и т. д. для свойств, которые вам нужно изменить. –
Вы НЕЗАВИСИМАЯ БАЗА. Нет причин иметь одну базу данных для каждого пользователя. Используйте только одну базу данных, но пишите систему так, чтобы пользователю разрешалось видеть только свои данные – RiggsFolly