laravelbrasil / forum

Ama Laravel? Torne se um Jedi e Ajude outros Padawans
GNU General Public License v3.0
251 stars 13 forks source link

Erro com tenant scope #205

Open rafael-marques opened 3 years ago

rafael-marques commented 3 years ago

Descrição Geral do Problema

Problema Encontrado

Pessoal, tudo joia? Tenho um scope que faz uma verificação se o usuário está logado e aplica a parte de separaçãod e tenant. Porém ao tentar implementar um ACL, ele retorna erro porque o usuário ainda não está logado quando verificamos dentro de AuthServiceProvider.php. Teria alguma forma de contornar isso?

Abordagem

Tentei usar Auth::check, ou injetar usuário no boot mas não resolveu

jedsonmelo commented 3 years ago

Não da para realizar a lógica de checagem em um middleware?

rafael-marques commented 3 years ago

Mas aí eu poderia registrar o gate do acl em um middleware?

jedsonmelo commented 3 years ago

Hm, não entendi que você tava registrando um gate, o closure do Gate::define() recebe o usuário logado. Então é só você checar se essa variável está null, se tiver null é porque o usuário não está logado.

https://laravel.com/docs/6.x/authorization#gates

rafael-marques commented 3 years ago

Entendi, mas de fato o usuário já está logado. Lendo um pouco aqui, descobri que os providers executam primeiro e mesmo que o usuário esteja logado, dentro do arquivo AuthServiceProvider.php ainda não terá essa info.

jedsonmelo commented 3 years ago

Sim, no AuthServiceProvider não há a possibilidade de utilizar o Auth::check(), mas a closure do gate só é executada quando o gate é chamado e como os gates são chamados geralmente em middlewares ou controllers, o usuário logado estará presente sem problemas.

jedsonmelo commented 3 years ago

Pro caso de separação do tenant, se precisa saber se o cara está logado ou algo do tipo, acho que o mais indicado será colocar em um middleware global. Acredito que dessa forma você garante que a aplicação já subiu/injetou todas as dependências e tbm garante que a lógica do tentant é executado em todas as requisições.