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" ?
Nesse ponto te enviei em formato zap , algumas pastas
pra vc analisar o projeto, então vc pediu pra acessar a minha maquina nessa semana.
com as modificações que fizemos , após o acesso com login e senha, a
aplicação esta retornando para a tela de login, depois da mudança de banco de dados.
Fala Wilmar!
Como enviou apenas partes do projeto, zipadas, isso dificulta muito o suporte.
A sua dúvida tem o caráter bem pessoal, mas ainda sim vou te ajudar, sem custos.
Assim que possível, combinamos o acesso e tento te ajudar.
Enquanto isso, vai exercitando as suas habilidades, tente resolve o problema de forma ativa.
Até breve, no e-mail! ;-)
segue o projeto no github como vc solicitou,
https://github.com/elasawilmar7/teste.git
na pasta "/public/images/" , tem os scripts dos 2 bancos de dados e o arquivo .Env
O erro que esta dando é quando passa pelo LoginController, faz a mudança de banco e autenticação, mas
esta retornando para a tela de login, ao inves, de seguir para a aplicação
Olá, Wilmar!
Boa, já clonei o projeto aqui para testar, pode deixar como privado, se quiser.
Assim que possível, já rodo aqui e vejo para você qual é o problema;
Carlos,
deu certo ver o projeto
https://github.com/elasawilmar7/teste.git ?
Seu projeto está atualizado no GitHub?
Pergunto, porque não encontrei nenhum outro controller além do Home e dos de autenticação.
--
Vamos por partes:
1) Aqui, está recuperando o client pelo seu database:
https://github.com/elasawilmar7/teste/blob/main/app/Http/Controllers/Auth/LoginController.php#L48
É importante verificar se não o encontrou, porque isso pode gerar uma exception para você:
if (!$cliente) {
return redirect()->back()->with('message', 'Cliente não encontrado');
}
--
Após o login, você chegou a criar a sessão do usuário? Onde você travou?
Carlos,
atualizei LoginController no git,
Como faço "você chegou a criar a sessão do usuário?" ?
Exatamente igual te passei no exemplo do dia "
10/11/2022", assim:
if (Auth::attempt(['email' => $email, 'password' => $password])) {
session()->put('tenant', $cliente);
// [...]
}
Carlos, já atualizei o git e a aplicação com "session()->put('tenant', $cliente);",
mas em que momento vou usar essa sessão? Nesse projeto não existe TentantMidlleware.
Você chegou a baixar o projeto e testar ?
Vamos um passo a passo, vai ser melhor assim, porque você mesmo consegue resolver este problema, melhor que ganhar a formula mágica.
--
Agora que criou a sessão, o seu próximo passo é criar o TentantMidlleware, assim como fizemos no curso, justamente para pegar o valor da sessão e mudar o banco de dados de forma dinâmica.
Quando fizer isso, me diga! :-)
Carlos,
atualizei o git.
criei o Middleware, então
lá no middleware fiz uma checagem se a sessão criada no LoginController existia, mas
não passou pelo IF.
Neste caso, como a sessão não existe, é porque não passou ainda pelo seu processo de autenticação.
Próximo passo: Você pode fazer o redirect para login, caso não exista a sessão.
--
O que está usando para armazenar as sessões? Redis?
Carlos,
sobre "O que está usando para armazenar as sessões? Redis?"
não sei te dizer, eu uso o Laragon e habilitei o Redis, mas pra trabalhar no outro projeto
com real time (socket.io).
Carlos,
Vi aqui no confg\session.php
'driver' => env('SESSION_DRIVER', 'file'),
A sessão é definida de acordo com a variável de ambiente definida no arquivo .env, chamada: SESSION_DRIVER
Provavelmente está com o valor default, file
--
Chegou a fazer o próximo passo? O if no middleware para redirecionar para login, caso ainda não tenha a sessão de tenant.
Carlos,
antes de fazer o proximo passo, fiz um teste.
coloquei o Log::info no TenantMiddleware e no LoginController (veja no git), então o arquivo laravel-2023-01-03.log,
me retornou assim :
[2023-01-03 21:19:43] local.INFO: array (
)
[2023-01-03 21:20:09] local.INFO: array (
)
[2023-01-03 21:20:26] local.INFO: array (
)
[2023-01-03 21:20:26] local.INFO: array (
'_token' => 'T3yfgfwISBpxzmXAGG7nB7cRFm2fjlqT5V5cFuup',
'_flash' =>
array (
'old' =>
array (
),
'new' =>
array (
),
),
'_previous' =>
array (
'url' => 'http://teste.test/login',
),
'login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d' => 618,
'tenant' =>
App\Models\Cliente::__set_state(array(
'fillable' =>
array (
0 => 'name',
1 => 'domain',
2 => 'bd_database',
3 => 'bd_hostname',
4 => 'bd_username',
5 => 'bd_password',
),
'connection' => 'tenant',
'table' => 'clientes',
'primaryKey' => 'id',
'keyType' => 'int',
'incrementing' => true,
'with' =>
array (
),
'withCount' =>
array (
),
'perPage' => 15,
'exists' => true,
'wasRecentlyCreated' => false,
'attributes' =>
array (
'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',
),
'original' =>
array (
'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',
),
'changes' =>
array (
),
'casts' =>
array (
),
'dates' =>
array (
),
'dateFormat' => NULL,
'appends' =>
array (
),
'dispatchesEvents' =>
array (
),
'observables' =>
array (
),
'relations' =>
array (
),
'touches' =>
array (
),
'timestamps' => true,
'hidden' =>
array (
),
'visible' =>
array (
),
'guarded' =>
array (
0 => '*',
),
)),
'url' =>
array (
'intended' => 'http://teste.test/home',
),
)
[2023-01-03 21:20:26] local.INFO: array (
)
[2023-01-03 21:20:27] local.INFO: array (
)
O seu log é de todas as sessões, o que você precisa focar é na sessão de tenant, essa sim.
$currentRouteName = Route::currentRouteName();
if (!session()->has('tenant') && $currentRouteName != 'login') {
return redirect()->name('login');
}
// https://laravel.com/docs/9.x/routing#accessing-the-current-route
Neste exemplo, se não existir a sessão, vai redirecionar para login (caso já não esteja em login - isso evita um loop infinito de redirect)
Carlos,
atualizei o git,
tive que fazer algums mudanças:
substituir para "$currentRouteName = $request->path();" , pq o outro estava devolvendo sempre NULL.
substituir para "return redirect()->route('login');" , pq o outro dava erro (esse projeto foi criado com Laravel 5.7)
e agora como fica ?
Legal. Agora me diga como ficou o funcionamentoo, quando faz o login, está conseguindo nevagar para as demais páginas do sistema?
Se sim, é porque está tudo ok (pelo menos no tocante, criação da sessão)
Carlos,
testando aqui,
quando eu acesso a aplicação (http://teste.test) vai para a tela de login direto,
após o acesso , retorna pra tela de login novamente, não vai para home.
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!