Laravel multi tenant com Auth do laravel
[Concluído]
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.
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.
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.
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.
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...
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()
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
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.
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.
Apaguei a tabela user do banco master e obtive um resultado interessante
https://imgur.com/yjWMF33
https://imgur.com/IQe6B5F
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.
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.
Assim deu certo? Posso finalizar o ticket?
Pode sim,
muito obrigado
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!