[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Roberto Noya
Criador Roberto Noya 12/07/2023

Olá Professor,

 

Estou desenvolvendo um sistema multi tenancy laravel 9 e uso sanctum.

Tenho Docker como ambiente de desenvolvimento e produção.

Uso REDIS nas seções e filas.

 

https://github.com/aytsystems/apirealstate

 

Quando eu acesso com um determinado TENANT eu consigo acessar as rotas que estão protegidas pelo sanctum “auth:sanctum”. Entretanto, quando tento acessar com outro usuário de outro tenant o sanctum não permite.

 

Achei estranho, pois ao logar, o token é gerado normalmente e fica registrado na tabela “personal_access_tokens”. Porém ao acessar uma rota com middleware sanctum ele desloga.

 

Já tentei limpar o app (comandos abaixo) mas não funciona.

 

Alguma dica?

 

php artisan cache:clear

php artisan route:cache 

php artisan config:clear

php artisan view:clear

Manager Carlos Ferreira 12/07/2023

Olá, Roberto!
Como vai?

Seu sistema é multi-tenancy, single database, certo?

Olhei por alto o seu projeto, achei estranho, porque na tabela users, tem a coluna tenant_id, mas essa tabela (tenants) só é criada após a tabela users. Altere o nome do arquivo da tabela de tenants, e deixa a ordem certinha, isso vai te ajudar com certeza.

--

Fiquei com algumas dúvidas ainda, todo usuário sempre está relacionado a um tenant?

Com um usuário funciona, mas com outros não?

Carlos Ferreira
Criador Roberto Noya 12/07/2023

Olá Professor,

 

Já renomeei as migrations para que fiquem na ordem correta. Obrigado por avisar.

 

Referente aos seus questionamentos:

 

Seu sistema é multi-tenancy, single database, certo?

Sim. O projeto e multi-tenancy single database.

 

 

Fiquei com algumas dúvidas ainda, todo usuário sempre está relacionado a um tenant?

 

Sim. Todo User possui um tenant_id relacionado. Inclusive se você olhar o arquivo “App\Http\Controllers\Auth\AuthController.php” você verá que eu valido o Tenant.

Caso não encontre o Tenant ativo e relacionado não loga.


Com um usuário funciona, mas com outros não?

Pois é... Esse e meu problema.

 

Os Users relacionados ao primeiro Tenant que foi cadastrado funcionam sem problemas.

A partir do segundo Tenant cadastrado, os Users relacionados perdem a autenticação quando acesso rotas com middleware sanctum.

 

O estranho é que ele loga e gera o token (Resultado do Postman):

 

"data": {

        "token": "566|PzugaDnx4j49G4jYLP5wRepm6wwCh79FhV0XXTQ8",

        "user": {

            "id": "7e5397ee-ab64-471c-b759-31b90c906121",

            "tenant_id": "d217d63b-27ae-43e4-bf28-d2839d77a1ab",

            "branch_id": "4dd6a8f4-e613-4302-910f-6efc3a1ac513",

            "name": "Daniel Carmona Fresneda"

 

Além disso, aparece o registro na tabela “personal_access_tokens”

Obs: Estou usando sempre a mesma maquina para testes no POSTMAN.

 

Será que existe alguma configuração no sanctum para multi-tenancy single database?

Roberto Noya
Manager Carlos Ferreira 12/07/2023

O problema está no seu global scope do model User, confere se está recuperando o usuário autenticado aqui: https://github.com/aytsystems/apirealstate/blob/main/app/Tenant/ManagerTenant.php#L9C18-L9C32

Carlos Ferreira
Criador Roberto Noya 12/07/2023

Eu acrescentei uma linha para debugar no arquivo ManagerTenant e não exibe o tenant_id.

Sera que meu AuthController esta errado?

public function getTenantIdentify()
{
dd(auth()->user()->tenant_id);
if(isset(auth()->user()->tenant_id)){
return auth()->user()->tenant_id;
}else{
return 1; // roda quando seed
}
}
Roberto Noya
Manager Carlos Ferreira 12/07/2023

Quando debuga apenas auth()->user(), o que mostra?
dd(auth()->user());

Carlos Ferreira
Criador Roberto Noya 12/07/2023

Mostra dd(auth()->user());

^ null
Roberto Noya
Manager Carlos Ferreira 12/07/2023

Vamos verificar se o usuário está autenticado: dd(\Auth::check());

Carlos Ferreira
Criador Roberto Noya 12/07/2023

aparece como false

dd(\Auth::check());
^ false

 

Ao logar gerou o token

"data": {
"token": "581|4pQUmS9FdsCrD7DYm9jEZSZKiiPf6Olw088gz4Nv",
"user": {
"id": "7e5397ee-ab64-471c-b759-31b90c906121",
"tenant_id": "d217d63b-27ae-43e4-bf28-d2839d77a1ab",
"branch_id": "4dd6a8f4-e613-4302-910f-6efc3a1ac513",
"name": "Daniel Carmona Fresneda",
Roberto Noya
Manager Carlos Ferreira 12/07/2023

Vi no seu arquivo api.php que tem algumas rotas que precisa de autenticação, e outras não, nos seus testes, você está acessando rotas que precisa de autenticação passando o token de acesso? Pq teoricamente era para retornar true o auth::check

Carlos Ferreira
Criador Roberto Noya 12/07/2023

Sim. estou usando rotas que precisa de autenticação.

Roberto Noya
Criador Roberto Noya 12/07/2023

Oi Professor,

Ja descobri o erro. 

Eu coloquei o TenantTrait na model User para que o Tenant posso visualizar somente os Users de sua base.

Porem ao fazer isso, a autenticação não funciona pois não tem o tenant_id.  

Dai eu pensei em acrescentar no arquivo AuthController no metodo a opcao withoutGlobalScape():

public function auth(AuthRequest $request)

    {

        $user = User::where('email', $request->email)->withoutGlobalScopes()->first();

 

Dessa forma ele gerar o token. (que burrada!)

 

Desculpe o trantorno!

 

Obrigado pelo costumeiro apoio.

 

Abraços.

 

 

Roberto Noya
Manager Carlos Ferreira 12/07/2023

Que bom que deu certo, meus parabéns!

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

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!