Sanctum - Multi Tenancy
[Concluído]
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
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?
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?
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
Eu acrescentei uma linha para debugar no arquivo ManagerTenant e não exibe o tenant_id.
Sera que meu AuthController esta errado?
Quando debuga apenas auth()->user(), o que mostra?
dd(auth()->user());
Mostra dd(auth()->user());
^ null
Vamos verificar se o usuário está autenticado: dd(\Auth::check());
aparece como false
^ false
Ao logar gerou o token
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
Sim. estou usando rotas que precisa de autenticação.
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.
Que bom que deu certo, meus parabéns!
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!