[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Wilmar Lima da Silva
Criador Wilmar Lima da Silva 03/11/2022

Carlos,

A conexão ao banco se da primeiramente pelo domínio.

exemplo :

xxx.aplicacao.com.br

onde pego o domínio xxx, pesquiso no banco master

e lá pego o nome do banco , então faço uma nova conexão com esse banco.

Minha dúvida é:

Ao invés de setar o banco pelo nome do domínio, eu gostaria

de ter um dominio fixo para a aplicação, e na tela de login

eu teria mais um campo : ID, e-mail e senha,

onde o campo ID serviria para setar o banco, nesse caso eu poderia

usar uma variável de sessão para salvar o "xxx" ?

Manager Carlos Ferreira 03/11/2022

Provavelmente não está criando a sessão, chegou a debugar (só debug após o login, antes não vai funcionar, porque a sessão de tenant não vai existir);

Carlos Ferreira
Manager Carlos Ferreira 03/11/2022

Chegou a debugar no TenantMidddleware? (só debug após o login, antes não vai funcionar, porque a sessão de tenant não vai existir);

 

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos,

"Chegou a debugar no TenantMidddleware?" Sim

fiz o debug após o login, no middleware a sessão "tenant" fica null

o projeto esta no github, 

tem como carregar ai e testar ?

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

Provavelmente sua sessão está sendo criada com sucesso, mas o seu middleware tenant ficou global.
https://github.com/elasawilmar7/teste/blob/main/app/Http/Kernel.php#L23

No seu caso, como vai trabalhar com sessão, precisa deixar este middleware dentro do grupo de middlewares web:
https://github.com/elasawilmar7/teste/blob/main/app/Http/Kernel.php#L32

Ou, vc vai precisar mover o seu middleware que inicia a sessão para os middlewares globais:
https://github.com/elasawilmar7/teste/blob/main/app/Http/Kernel.php#L35

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos,

fiz isso: "https://github.com/elasawilmar7/teste/blob/main/app/Http/Kernel.php#L32"

a sessão apareceu dentro do middleware:

{"id":7,"uuid":"bddb2cd8-e094-11ea-957f-d09466a24655","name":"BEE liga","domain":"ufa.upmaster-em.test","bd_database":"ufa-em","bd_hostname":"localhost","bd_username":"root","bd_password":"1234","created_at":"2020-08-31 11:20:03","updated_at":"2020-08-17 11:20:03"}

mas , não sei pq , quando uso

"if (!session()->has('tenant')) {", entra no IF 

e se eu usar : "if (session()->has('tenant')) {", também entra no IF

 

 

 

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

Opa, agora está criando a sessão, você está progredindo. Parabéns!

--

Ténicamente, é impossível entrar neste dois IFs:
if (!session()->has('tenant')) {}
if (session()->has('tenant')) {}

A não ser, que sejam em momentos diferentes (antes de depois do login)

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos, da uma olhada lá no Kernel, se esta correto

https://github.com/elasawilmar7/teste/blob/main/app/Http/Kernel.php

No protected $middleware = [

e

No

protected $middlewareGroups = [

Wilmar Lima da Silva
Criador Wilmar Lima da Silva 03/11/2022

Carlos, tava dando erro porque estava chamando o middleware que estava em $middleware (que não recebia sessaõ) e em $middlewareGroups,

em Kernel.php 

então deixei o middleware apenas em $middlewareGroups, ai o controle da sessão tenant ficou ok.

Mesmo adicionando na rota:

Route::get('/home', 'HomeController@index')->name('home')->middleware('web');

Quando faço o acesso, não vai pra Home, ainda continua voltando pro Login.

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

O seu login está correto. Após se autenticar, não redireciona para /home?

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Não esta indo pra home , retorna pra login

e agora ?

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

Mas, está validando os dados corretamente:
https://github.com/elasawilmar7/teste/blob/main/app/Http/Controllers/Auth/LoginController.php#L59

if (Auth::attempt($credentials)) {
    dd('Opa, login com sucesso');
}

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos,

segue um video 

https://drive.google.com/file/d/1stHrw2-tfeXFcjsdlomUo8EcdEguDCY_/view?usp=sharing

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

E no TenantMiddleware, após o login, tem ou não a sessão?
Nas respostas anteriores você tinha mencionado que tinha.

dd(session()->has('tenant'));

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos,

Sim, veja o video :

https://drive.google.com/file/d/1mXgUntYIFLXEq-xw4gKWNkXqo7DKU4zB/view?usp=sharing

 

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

Perfeito ter mandado o vídeo, isso me ajuda a te ajudar.

Só confirma para mim, não apareceu este log, ou apareceu e eu não percebi?
https://github.com/elasawilmar7/teste/blob/main/app/Http/Controllers/Auth/LoginController.php#L61

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos,

no minuto 0:43 do video tem lá "Opa, login com sucesso"

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

Sugiro que assista novamente as aulas do curso de multi-database, lá resolvemos um case bem semelhante ao seu.

O que acontece agora, por que não está "fixando" a sessão de autenticação?
A sessão existe, e o usuário está logado, mas quando redireciona (e isso sempre acontece) volta a se conectar no banco de dados default, e com isso valida a sessão do usuário neste banco, porém o usuário está conectado a outro banco de dados.

O que precisa fazer?
No tenant middleware, reconectar o usuário ao banco do tenant novamete (usando a sessão que já existe).

Exatamente o que fizemos no TenantMiddleware do curso, porém no seu caso, ficou ainda mais simples, porque o tenant vem da sessão. Pimba!

Pegou o que faltou?

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos, fiz o tenantmiddleware assim: (mas ficou dando loop)

$currentRouteName = $request->path();

 

        if (!session()->has('tenant')) {

            Log::info('sessao NÃO existe');

        }

 

        if (session()->has('tenant')) {

            Log::info('sessao foi criada');

        }

 

        if (Auth::check()) {

            Log::info('Logado');

        } else {

            Log::info('Não Logado');

            if (session()->has('tenant')) {

                $manager = app(ManagerTenant::class);

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

                Log::info('re conectar');

                $manager->setConnection($cliente);

                $manager->setFileSystems($cliente);

                return redirect()->route('home');

            }

        }

        //session()->flush();

 

 

        if (!session()->has('tenant') && $currentRouteName != 'login') {

            Log::info('foi para o login');

            return redirect()->route('login');

        }

 

 

        return $next($request);

Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

Sua lógica quase ficou certa.

O primeiro if ficou desnecessário, porque se existir a sessão "tenant", teoricamente o usuário já está autenticado, logo, o que você precisa fazer é simplesmente alternar a conexão. Não precisa redirecionar novamente para home, basta deixar o fluxo:
return $next($request);

Carlos Ferreira
Criador Wilmar Lima da Silva 03/11/2022

Carlos , fiz assim, mas continua no loop (Redirecionamento em excesso por teste.test)

public function handle($request, Closure $next)

    {

 

        $currentRouteName = $request->path();

 

 

        if (session()->has('tenant')) {

            $manager = app(ManagerTenant::class);

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

            Log::info('re conectar');

            $manager->setConnection($cliente);

            $manager->setFileSystems($cliente);

        }

 

 

        if (!session()->has('tenant') && $currentRouteName != 'login') {

            Log::info('foi para o login');

            return redirect()->route('login');

        }

 

 

        return $next($request);

    }

 

Wilmar Lima da Silva
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!