[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Jonathas Garcia Soares
Criador Jonathas Garcia Soares 09/11/2020

Bom dia a todos,

 

Estou terminando o curso do laravel multi tenant multi database, porem com pequenas modificações pois preciso informar o tenant que está acessando atravez do subdominio, estou com umas duvidas referentes a como proteger as rotas protegidas pois apesar do função  auth::attempt está efetuando as validações, quando eu adiciona o middleware auth na rota que desejo proteger  ele retorna que não está logado, se puderem me auxiliar fico grato.

Manager Carlos Ferreira 09/11/2020

Olá, Jonathas!
Tudo bem?

Ajudo sim, claro.

Me dê um pouco mais de detalhes por favor (prints do erros: https://imgur.com/upload)

Eu também gostaria de ver o código fonte, no mínimo o arquivo de rotas.

Carlos Ferreira
Criador Jonathas Garcia Soares 09/11/2020

Oi Carlos,

Eu vou bem, e voce como vai?

Então, eu publiquei o projeto no gitlab: https://gitlab.com/joul.gs/laravel-multidb

Se voce puder dar uma olhada ;)

ele funciona assim:

Na pagina inicial não apliquei nenhum middleware, pois quero que a troca do banco seja feita na pagina do login e nas paginas dentro do sistema, apos autenticado,

Na pagina inicial o cliente consegue se registrar, apos se registrar o sistema vai salvar ele como cliente no banco master, criar um banco de dados para ele, e salvar o usuario que dele no banco do cliente.

nesse registro o cliente precisa informar um CNPJ pi CPF, que será utilizado para identificar ele como tenant,

toda a parte de criação do usuario e do banco está funcionando, o login tambem funciona, o sistema obriga ele a informar o CNPJ/CPF antes de logar e ja redirecioa ele para uma pagina de login onde o middleware ja seta o banco de dados dele, apos o login ele vai para uma pagina que deveria está protegida, mas se eu ativar o middleware AUTH o sistema identifica ele como não logado e redireciona ele para o login novamente.

voce pode ver isso descomentando a linda 16 no App\Http\Controllers\HomeController.

 

PS: estou adorando os cursos, fiz a assinatura e estou proveitando o maximo.

 

 

 

 

Jonathas Garcia Soares
Manager Carlos Ferreira 09/11/2020

Olá, Jonathas!

Comigo tudo certo também.

O mesmo usuário tem cadastro tanto no banco principal (master) e em seu respectivo banco também?

Você consegue recuperar o usuário a partir do CNPJ ou CPF dele, certo?

Agora pode autenticar esse usuário, dessa forma aqui:
Auth::login($user);

(https://laravel.com/docs/8.x/authentication#other-authentication-methods)

Dessa forma você pode aplicar o middleware auth que vai autenticar o usuário em questão.

Carlos Ferreira
Criador Jonathas Garcia Soares 09/11/2020

Boa Tarde,

no momento so estou salvando o usuario no banco do cliente, mas estou pensando em salvar no master tambem para verificar,

Não estou conseguindo recuperar o usuario depois do login, no login ele recupera, perserbir que o middleware não está funcionando na rota que vai pra dentro do sistema,

dei uma olhada no metodo login do helper Auth e parece que vai atender, mas como não consigo recuperar não conseguir logar,

quando cheguei nesse ponto pensei em usar a session para transportar os dados, mas por algum motivo a session não está passando os dados para outra pagina tambem, consigo salvar e recuperar dados dentro da controller de login, mas se salvo no controller de login e tento recuperar no homeController recebo null...

Jonathas Garcia Soares
Criador Jonathas Garcia Soares 09/11/2020
App\Models\User {#267 ▼
  #fillable: array:3 []
  #hidden: array:2 []
  #casts: array:1 []
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: false
  +wasRecentlyCreated: false
  #attributes: []
  #original: []
  #changes: []
  #classCastCache: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #visible: []
  #guarded: array:1 []
  #rememberTokenName: "remember_token"
}

 

esse é o retorno no User->all()

Jonathas Garcia Soares
Criador Jonathas Garcia Soares 09/11/2020

descobrir que no Config/database.php linha 18 eu não tinha atualizado o valor default do DB_CONNECTION para tenant, apos acertar isso o Helper AUTH passou a funcionar apos logado e conseguir e redirecionar para o login quando não logado,

Porem se eu altero manualmente a URI ele mantem a sessão como se outro tenant tambem estivesse logado,

exemplo:

logo no tenant 123 e sou redirecionado para a pagina

http:/dominio/123/sitema

e se eu troco o identificado do tenant por outro como http:dominio/456/sistema o sistema entra como, como se eu tivesse logado. agora vou investigar isso, mas nem imagino o que possa ser rsrs

 

 

 

Jonathas Garcia Soares
Manager Carlos Ferreira 09/11/2020

Olá, Jonathas!

Mas, quando muda o identificador do tenant a conexão é alterada corretamente para o banco do tenant, certo?

Acontece que está trabalhando com uma única sessão, e por isso entende de entender que já está logado.

Você pode criar uma sessão adicional para controlar qual/is tenants estão autenticados.

Carlos Ferreira
Criador Jonathas Garcia Soares 09/11/2020

Bom dia Carlos, Tudo bem?

Amigo, veja se voce consegue me ajudar com uma duvida,

finalmente eu descobrir uma variavel que causa o erro do login no laravel com multi tenant, eu so consigo logar se no banco master tiver um usuario com o mesmo ID do usuario no banco tenant, não sei se isso é alguma verificação do laravel, mas ele consulta o email e senha no banco tenant normal, mas so loga se no banco master tiver um usuario com mesmo ID.

Jonathas Garcia Soares
Criador Jonathas Garcia Soares 09/11/2020

Apaguei a tabela user do banco master e obtive um resultado interessante 

https://imgur.com/yjWMF33

 

https://imgur.com/IQe6B5F

Jonathas Garcia Soares
Manager Carlos Ferreira 09/11/2020

Por default o Laravel pega o usuário autenticado (sessão) e faz uma consulta ao banco para validar. Se instalar o Laravel Debugbar vai notar essa consulta típica e comum.

Mas, por que não deixar o user apenas no banco correspondente do tenant?
Essa dinâmica ainda não está muito bem clara, pelo menos não para mim.

Se importa de fazer um vídeo amigo?
Porque fica mais fácil contextualizar a sua dúvida.

Carlos Ferreira
Criador Jonathas Garcia Soares 09/11/2020

Bom dia Carlos,

Então, eu já estou deixando o user apenas no banco correspondente ao tenant,

Eu decidir que irei usar uma middleware proprio como alternativa ao auth do laravel.

Jonathas Garcia Soares
Manager Carlos Ferreira 09/11/2020

Assim deu certo? Posso finalizar o ticket?

Carlos Ferreira
Criador Jonathas Garcia Soares 09/11/2020

Pode sim,

muito obrigado

Jonathas Garcia Soares
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!