[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

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...
}

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

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);

    }

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

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 Ferreira
Criador Wilmar Lima da Silva 03/11/2022

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.

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

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! :)

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

segue: 

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)) {
            //return redirect()->to('http://ufa.upmaster-em57.test/coordinator/simulation');
            return redirect()->route('simulation.index');
        }
}
Wilmar Lima da Silva
Manager Carlos Ferreira 03/11/2022

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?

Carlos Ferreira
Manager Carlos Ferreira 03/11/2022

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;)

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

Sim esta entrando no IF,

"Como está armazenando as sessões? Redis?"

como vejo isso ?

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

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;)

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

"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);

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

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);

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

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

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

Tem o projeto no GitHub?

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

Não posso liberar no git de forma publica,

me diz o que vc precisa ver que ponho no drive do gmail

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

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

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

Você teria que carregar a aplicação?

se eu te enviar a pasta app dá certo ?

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

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.

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

pronto ja enviei email

 

Wilmar

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

Beleza, finalizando aqui.

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!