Как сделать логин с динамической базой данных? - PullRequest
1 голос
/ 27 марта 2019

Я делаю проект на 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. Зачем? я не знаю пожалуйста исправьте этот код.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

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

Я просто создаю функцию, которая ищет DB_NAME в файле .ENV и заменяет его.когда мой БД для входа в систему для клиентов найден, он заменяет старое имя БД новым на .ENV.После входа в систему снова замените имя базы данных по умолчанию при выходе.

   protected function updateEnv($key, $newValue, $separator='')
    {

        $path = base_path('.env');
        // get old value from current env
        $oldValue = env($key);

        // was there any change?
        if ($oldValue === $newValue) {
            return;
        }

        // rewrite file content with changed data
        if (file_exists($path)) {
            // replace current value with new value
            return  file_put_contents(
                $path, str_replace(
                    $key.'='.$separator.$oldValue.$separator,
                    $key.'='.$separator.$newValue.$separator,
                     file_get_contents($path)
                )
            );
        }
    }

// для входа в систему

  $this->updateEnv('DB_DATABASE',$appClient->db_name,'');

, но проблема остается.в первый раз возвращается null и снова обновляется, все работает нормально .. почему?я не знаю.

Это решение не работает для более чем одного входа в систему из другого местоположения ...

0 голосов
/ 27 марта 2019

вы на правильном пути.Просто еще нет.

вам нужно добавить весь запрос входа в систему в промежуточном программном обеспечении, и для каждого соединения с базой данных, которое вы хотите проверить, вы устанавливаете переключатель или try / catch (с -> continue) или if/ elseif оператор, который нужно выполнить, бросить evry соединение с базой данных, которое у вас есть, и если пользователь найден в 1 из них, он соединится с ним и перейдет к следующему запросу, если нет, то он выдаст ошибку.обратите внимание, что в ваших заявлениях (переключатель соединения с базой данных) вам необходимо очистить ваше соединение и снова подключиться к новому имени пользователя / паролю базы данных.Вы можете использовать (

        DB::purge('mysql');

 config(['database.connection.mysql' => 
'driver' => 'mysql',
'host' => ''.
'database' =>,
etc.....
]));
        DB::reconnect('mysql');
        Schema::connection('mysql')->getConnection()->reconnect();

)

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...