Я делаю проект на Laravel 5.7 . где я должен управлять логином с динамической базой данных. где одна основная база данных, а другая - это дополнительная база данных.
Поэтому, когда пользователь указывает данные для входа в систему, сначала проверьте базу данных master, если имя входа не найдено на master, тогда он будет смотреть электронную почту в таблице App_clients в таблице master_db , найти имя базы данных этого идентификатора электронной почты и проверить войдите. Если все прошло успешно, перейдите на панель инструментов. и каждый раз, пока вы не войдете в базу данных (client_2), база данных будет активной.
Основная цель этой концепции - два разных входа в систему.
1) Войдите в систему для главной базы данных, которая будет только для владельца программного обеспечения.
2) Еще один логин для клиента, который использует это программное обеспечение.
Таким образом, когда клиент войдет в систему, его имя базы данных появится в виде таблицы App_client с использованием email . Поэтому Laravel Database Config изменится и установит новую базу данных для их использования, и база данных будет активной, пока клиент вошел в систему, иначе база данных по умолчанию будет активной.
Например
База данных :: Master_db , Client_2_db , Client_3_db
и т. Д.
электронная почта: abc@ex.com и пароль: 1234 хранится в Client_2_db.
Сначала он проверит Master_db. это не удастся. тогда его электронная почта будет выглядеть на Master_db.App_clients и получит имя базы данных, которое хранится на Master_db.App_clients .
Поэтому после этого попробуем войти в систему с Client_2_db.
Так что для этого я использую этот код на myLoginController .
if( $request->client == '1111111' )
{
Config::set('database.default', 'mysql');
DB::reconnect('mysql');
$loginCheck= Auth::attempt( ["email" =>$request->username , "password" => $request->password ] );
if( $loginCheck )
{
// Store Collage ID on session variable.
$client = SettingClient::where('client_CODE',$request->client_code)->first();
$request->session()->put('client', $client->ID );
$request->session()->put('cclient_code', $client->client_CODE );
$request->session()->put('client_name', $client->client_NAME );
$request->session()->put('database_name', 'col_master' );
return redirect('dashboard');
}
goto InvalidLoginFound;
}
elseif ( $request-> client_code != '1111111' )
{
$clientCheck = AppClient::where("client_code" , $request->client_code )->orderBy('id','desc')->first();
if( !$clientCheck )
{
goto clientCodeNotFound ;
}
DB::purge('mysql');
Config::set("database.connections.mysql", [
"driver" => "mysql",
"host" => env('DB_HOST'),
"database" => $clientCheck->database_name,
"username" => env('DB_USERNAME'),
"password" => env('DB_PASSWORD'),
"engine"=>"InnoDB",
]);
Config::set('database.default', 'mysql');
DB::reconnect('mysql');
$loginCheck= Auth::attempt( ["email" =>$request->username , "password" => $request->password ] );
if( $loginCheck )
{
// Store client ID on session variable.
$client = SettingClient::where('client_CODE',$request->client_code)->first();
if( !$client )
{
goto clientCodeNotFound;
}
$request->session()->put('client', $client->ID );
$request->session()->put('login_id', $request->username );
$request->session()->put('password', $request->password );
$request->session()->put('client_code', $client->client_CODE );
$request->session()->put('client_name', $client->client_NAME );
$request->session()->put('database_name', $clientCheck->database_name );
return redirect('dashboard');
}
$request->session()->flush();
Auth::logout();
goto InvalidLoginFound;
}
также создал для этого промежуточное ПО, которое управляет базой данных при каждом запросе.
class DynamicDatabaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if( session()->get('login_id') )
{
DB::purge('mysql');
Config::set("database.connections.mysql", [
"driver" => "mysql",
"host" => '127.0.0.1',
"database" => session()->get('database_name')?session()->get('database_name'):'',
"username" => 'root',
"password" => '',
"engine"=>"InnoDB",
]);
// Config::set('database.default', 'mysql');
DB::reconnect('mysql');
}
return $next($request);
}
}
на Karnel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\SessionDataMiddleware::class,
\App\Http\Middleware\StoreExceptionMiddleware::class,
\App\Http\Middleware\DynamicDatabaseMiddleware::class,
],
после того, как это работает, но проблема в том, что когда я пытаюсь проверить вход в систему Auth :: user () , тогда я всегда получаю данные для входа из Master_db (col_master) формы из client_db.
Зачем? я не знаю пожалуйста исправьте этот код.