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

Boa noite, professor.

Para o usuário deletar apenas o que ele inseriu no banco, o mais simples seria no request fazer uma regra de validação? Tipo required|... {id}, id

 

Manager Carlos Ferreira 07/11/2020

Olá, "Alzcla"!
Tudo bem?

Existem muitas formas segura de garantir isso.

Uma delas (que usei nos cursos de multi-tenancy) foi usando Scopes, que filtra os registros pelo tenant_id (ou id do usuário)

Outra forma de fazer, é usando os Gates (ensino isso no curso LaraFood).

Outra maneira de fazer isso é fazer um filtro na query mesmo, manual:
->where('user_id', auth()->user()->id)

Carlos Ferreira
Criador AlzClar 07/11/2020

Show!

O site está ficando legal rodando...Aprendi muito com meus erros...

Valeu!

AlzClar
Criador AlzClar 07/11/2020

Professor, boa tarde.

Se fosse usar o authorize na agência de turismo, no aeroporto do seu código, para proibir que outros usuários editassem ou deletassem o que foi feito por outro usuário, como ficaria?

 

Abç

AlzClar
Manager Carlos Ferreira 07/11/2020

Olá, tudo bem?

Você finalizou esse ticket, tudo certo?

Carlos Ferreira
Criador AlzClar 07/11/2020

Acreditei que estava tudo certo, mas...fui testar uns dias depois...ele não autoriza para o usuário que fez o registro...Continuei daqui para manter o mesmo assunto...

public function surveysDestroy($idCompany, $id)

{

Gate::authorize('surveysDestroy', $id)

$survey = $this->survey->find($id);

 

...

}

AlzClar
Criador AlzClar 07/11/2020

Bom dia! Complementando...

Eu cadastro uma "companhia". Na view da companhia, eu clico em cadastrar "reclamações" da companhia. 

Na tabela da companhia não há coluna user_id, mas na tabela de reclamações, tenho a coluna user_id.

Fiz "use App\Models\Companhia  e  vou (amanhã) tentar pegar o $user_id

AlzClar
Manager Carlos Ferreira 07/11/2020

Como está passando o $id e não um objeto, lá no Provider deve estar assim:
Gate::define('surveysDestroy', function (User $user, $id) {
    return $user->id === $id;
});


----------

Mas o ideia seria:
// Provider
Gate::define('surveys-destroy', function (User $user, $survey) {
    return $user->id === $survey->user_id;
});

// Controller
$survey = $this->survey->find($id);
Gate::authorize('surveys-destroy', $survey);


-------

DICA: O LaraFood tem um complexo sistema de ACL no projeto, pode ser muito útil para você.

Carlos Ferreira
Criador AlzClar 07/11/2020

Boa noite professor!

Eu estava passando $survey, mas vi que, quando tentava deletar (editar), estavam sendo visualizados os detalhes de outra empresa (ou reclamações). Lembrei que havia feito um teste e voltei o id e visualizei corretamente.

Como está passando o $id e não um objeto, lá no Provider deve estar assim:
Gate::define('surveysDestroy', function (User $user, $id) {
    return $user->id === $id;
});

Testei a ideia acima e cai na página de erro... vi que lá na url... estava /site/empresa//survey(reclamações)/17 aí comecei a verificar o id da empresa...

Mas voltei para o ideal:

// Provider
Gate::define('surveys-destroy', function (User $user, $survey) {
    return $user->id === $survey->user_id;
});

// Controller
$survey = $this->survey->find($id);
Gate::authorize('surveys-destroy', $survey);

Volta a cair na página de erro...

A minha tabela surveys tem user_id e empresa_id e os relacionamentos...

As tabelas empresas e users não possuem relacionamentos com chaves estrangeiras...

Se eu tivesse tabela pivô, eu iria para o "attech e detach"...

Criei uma coluna user_id na tabela empresas. Vou salvar um auth()->user() e tentar salvar na outra tabela de reclamações...

 

O LaraFood tem um complexo sistema de ACL no projeto, pode ser muito útil para você:

Eu segui o curso da agência de Turismo e qdo veio a origem e destination, fiquei confuso em adaptar... Mais a frente, há a visualização do voo e depois é creado e feita a reserva...mais ou menos isso. Aí é que acontece a mágica de salvar tudo no mesmo usuário...

Certo!?

Abç

 

AlzClar
Manager Carlos Ferreira 07/11/2020

Se isso daqui está gerando uma página de erro (403), é porque o user_id de survey está diferente do id do usuário autenticado:
$survey = $this->survey->find($id);
// faça o teste
dd($survey->user_id == auth()->user()->id);
Gate::authorize('surveys-destroy', $survey);

-----------------

Sobre essa parte aqui:
As tabelas empresas e users não possuem relacionamentos com chaves estrangeiras...

Se eu tivesse tabela pivô, eu iria para o "attech e detach".

RE: Sinceramente não entendi nada do que quis dizer. É o que eu sempre te oriento amigo, eu estou fora do seu projeto, não faço ideia de como implementou e menos ainda da lógica que usou.


---------------------

Mais a frente, há a visualização do voo e depois é creado e feita a reserva...mais ou menos isso. Aí é que acontece a mágica de salvar tudo no mesmo usuário...

RE: Também não entendi o que quis dizer...

Carlos Ferreira
Criador AlzClar 07/11/2020

Professor,

Sinceramente não entendi nada do que quis dizer. É o que eu sempre te oriento amigo, eu estou fora do seu projeto, não faço ideia de como implementou e menos ainda da lógica que usou

Minha referência são seus cursos. Seu código. Lembra plans, details, tenant, profiles, permissions? Para vincular os detalhes de um plano, foi usado "attech" e "detach". Usei entre aspas pq não lembrei a grafia correta... Sobre esses métodos, li na documentação do láravel que se usa uma tabela pivô...mas deve ser um caso particular...

Também não entendi o que quis dizer...

Sobre isso segui as suas aulas do curso de agência de turismo...mas não entrei na aula de reservas... Agora a pouco, assisti essas aulas até a aula de cadastro de reservas... e já tirei umas dúvidas nessas aulas...

 

AlzClar
Manager Carlos Ferreira 07/11/2020

Posta o código, e diga exatamente onde está o problema. É porque sem ver o seu código e entender o real problema não consigo te ajudar.

No aguardo amigo.

Carlos Ferreira
Criador AlzClar 07/11/2020

Professor! Um momento...Eu troquei o HD para o de SSD. Só não achei ainda o arquivo do projeto.

AlzClar
Manager Carlos Ferreira 07/11/2020

Ok, se possível faça um vídeo também, porque fica mais fácil de te entender o problema.

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

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!