Sobre outra forma de conexão do banco de dados
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" ?
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);
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,
"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 ?
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,
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
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, 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 = [
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.
O seu login está correto. Após se autenticar, não redireciona para /home?
Não esta indo pra home , retorna pra login
e agora ?
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,
segue um video
https://drive.google.com/file/d/1stHrw2-tfeXFcjsdlomUo8EcdEguDCY_/view?usp=sharing
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,
Sim, veja o video :
https://drive.google.com/file/d/1mXgUntYIFLXEq-xw4gKWNkXqo7DKU4zB/view?usp=sharing
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,
no minuto 0:43 do video tem lá "Opa, login com sucesso"
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, 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);
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 , 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);
}
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!