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" ?
Olá, Wilmar!
Tudo bem?
Neste caso fica até mais fácil.
O que precisa fazer é setar alternar a conexão de acordo com o valor do "id"
$tenant = $request->id;
// Alterna a conexão aqui, para o banco do tenant
// Aqui, ao tentar autenticar, já está com a conexão no banco do tenant
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// Authentication was successful...
}

nesse caso, vou ter que comentar as linha de código no middleware: (isso ?)
public function handle($request, Closure $next)
{
$manager = app(ManagerTenant::class);
if ($manager->domainIsMain()) {
return $next($request);
}
$cliente = $this->getCliente($request->getHost());
if (!$cliente && $request->url() != route('404.tenant')) {
return redirect()->route('404.tenant');
} else if ($request->url() != route('404.tenant') && !$manager->domainIsMain()) {
$manager->setConnection($cliente);
$manager->setFileSystems($cliente);
}
return $next($request);
}

Sim, precisa revisar essa lógica para atender ao novo critério de escolha de tenant, que no caso será definido diretamente no form de autenticação, e não mais pelo domínio;

Carlos,
criei o metodo Login no controller LoginController,
nele, fiz
a consulta e troca de banco, então
if (Auth::attempt(['email' => $email, 'password' => $password])) {
e faço o redirecionamento dentro do if...
Quando fui testar a aplicação , passa pelo if (acima) mas a aplicação retorna pra tela de login, não
vai pra tela que faço o redirecionamento.

Como está o código do método login, me dê mais detalhes por favor, porque assim consigo ter uma visão melhor te ajudar a resolver. No aguardo! :)

segue:

Então, está entrando neste if, certo?
if (Auth::attempt($credentials)) {
dd('aqui');
return redirect()->route('simulation.index');
}
Como está armazenando as sessões? Redis?

Tem um ponto importante também, você tem um middleware global que alterna a conexão antes de qualquer coisa?
É importante, porque se valida a sessão criada, mas está conectado ainda na base diferente, vai entender que o usuário não existe (e realmente não existe, naquele banco;)

Sim esta entrando no IF,
"Como está armazenando as sessões? Redis?"
como vejo isso ?

Acredito que o problema está na realidade aqui:
Tem um ponto importante também, você tem um middleware global que alterna a conexão antes de qualquer coisa?
É importante, porque se valida a sessão criada, mas está conectado ainda na base diferente, vai entender que o usuário não existe (e realmente não existe, naquele banco;)

"Tem um ponto importante também, você tem um middleware global que alterna a conexão antes de qualquer coisa?"
Sim, TenantMiddleware, mas comentei:
public function handle($request, Closure $next)
{
/* $manager = app(ManagerTenant::class);
if ($manager->domainIsMain()) {
return $next($request);
}
$cliente = $this->getCliente($request->getHost());
if (!$cliente && $request->url() != route('404.tenant')) {
return redirect()->route('404.tenant');
} else if ($request->url() != route('404.tenant') && !$manager->domainIsMain()) {
$manager->setConnection($cliente);
$manager->setFileSystems($cliente);
} */
return $next($request);
}
"É importante, porque se valida a sessão criada, mas está conectado ainda na base diferente, vai entender que o usuário não existe (e realmente não existe, naquele banco;)"
como eu contorno isso? a aplicacao inicia com o banco master, onde esta os clientes, depois muda para o cliente desejado,
com $manager->setConnection($cliente);

No seu caso muda um pouco, porque não vai mais identificar o tenant pelo host, mas sim pela sessão de autenticação.
--
Faça assim, no seu login, cria uma sessão, exemplo:
if (Auth::attempt(['email' => $email, 'password' => $password])) {
session()->put('tenant', $cliente);
// [...]
}
--
Agora no seu middleware (TenantMiddleware), global, basta validar se existe essa sessão, se existe, já alterna a conexão para o banco de dados te tenant e pronto.
$client = session()->get('tenant');
if ($client) {
// redireciona para o dashboard
}
return $next($request);

Fiz :
public function login(Request $request)
{
$manager = app(ManagerTenant::class);
$cliente = Cliente::where('domain', $request->id)->First();
$manager->setConnection($cliente);
$manager->setFileSystems($cliente);
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
session()->put('tenant', $cliente);
//return redirect()->to('http://ufa.upmaster-em57.test/coordinator/simulation');
//return redirect()->route('simulation.index');
}
}
TenantMiddleware:
public function handle($request, Closure $next)
{
$cliente = session()->get('tenant');
if ($cliente) {
dd($cliente);
}
return $next($request);
}
não sei pq , mas no tenantmiddleware a sessão tenant sempre retorna vazia, não passa pelo if($cliente

Tem o projeto no GitHub?

Não posso liberar no git de forma publica,
me diz o que vc precisa ver que ponho no drive do gmail

Entendo. Mas, Google drive seria horrível para mim ler o código, baixar e etc;

Você teria que carregar a aplicação?
se eu te enviar a pasta app dá certo ?

Vou te direcionar para outro canal de atendimento, encaminha ela com todos os detalhes para o e-mail preciso-consultoria@especializati.com.br
Envia prints por lá, porque assim fica mais restrito entre nós dois a conversa.

pronto ja enviei email
Wilmar

Beleza, finalizando aqui.

Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!