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 [email protected]
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!