2015-10-02 4 views
1

Я пытаюсь взломать несколько приложений с несколькими базами данных с использованием laravel. Пройдя много статей в Интернете, я теперь понимаю, что существуют разные подходы к архитектуре базы данных.Mutli аренда приложений в laravel 5?

  1. Чтобы иметь единую базу данных и иметь tenant_id внешний ключ, чтобы отделить арендатор запись
  2. Чтобы иметь несколько баз данных для разделения данных каждого арендатора

проекта я работаю над требует, чтобы каждый арендатор имеет его собственную базу данных для целей безопасности. Теперь я пытаюсь вручную взломать установку 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.

Но опять же я смущен, что если я нахожусь на правильном пути с таким подходом?

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

+0

Я согласен с @RiggsFolly , но если вам действительно нужна эта структура, я думаю, вы можете изменить настройки приложения/config/database.php usin g в классе Config, поэтому для изменения вашей базы данных вы должны выполнить Config :: set ('database.default', 'sqlite'); и т. д. для свойств, которые вам нужно изменить. –

+1

Вы НЕЗАВИСИМАЯ БАЗА. Нет причин иметь одну базу данных для каждого пользователя. Используйте только одну базу данных, но пишите систему так, чтобы пользователю разрешалось видеть только свои данные – RiggsFolly

ответ

0

Модель Eloquent имеет метод, называемый setConnection, который вы можете использовать для установления соединения.

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

$nameKey = 'NameOfConnection'; 

$dataSync = AtlasBases::find($id_client); 

Config::set('database.connections.' . $nameKey, array(
     'driver' => 'mysql', 
     'host'  => $dataSync->site_db_server, 
     'database' => $dataSync->site_db_base, 
     'username' => $dataSync->site_db_user, 
     'password' => $dataSync->site_db_password, 
      'charset' => 'utf8', 
     'collation' => 'utf8_general_ci', 
     'prefix' => '', 
)); 
# And set the new connection to my models 

$imobModel = new ImobImoveis; 
$imobModel->setConnection($nameKey); 

Взгляните на следующие ссылки:

https://laracasts.com/discuss/channels/general-discussion/hitting-multiple-databases-dinamically-with-laravel?page=1

https://laracasts.com/discuss/channels/general-discussion/l5-change-default-database-connection-dynamically?page=1#reply-45910

А вот это демо-хранилище, которое использует аналогичное решение: https://github.com/uxweb/laravel-multi-db