[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Rodrigo VC
Criador Rodrigo VC 25/02/2020

Boa tarde,

 

estou tentando implementar acl para limitar a edição do cadastro de usuarios. Gate recebe o primeiro parametro do usuario logado e o segundo parametro um model. Só que nesse caso ambos são o mesmo model. Como fazer?

 

Código do provider:

 

Gate::define('user-edit', function(User $user ){

            return Auth()->user()->id === $user->id;

        });

 

Código no metodo update do controller:

 

$usuario = User::find($id);

 

        $this->authorize('user-edit', $usuario->id_);

 

 

 

Manager Carlos Ferreira 25/02/2020

Olá, Rodrigo!
Tudo bem?

No seu Gate você precisa passar os dois parâmetros, o primeiro sempre vai pegar o usuário autenticado.

Precisa ficar assim:
Gate::define('user-edit', function(User $userAuth, User $user){
    return $userAuth->id === $user->id;
});

// usando
$this->authorize('user-edit', $idAqui);

Carlos Ferreira
Criador Rodrigo VC 25/02/2020

Ola Carlos,

 

fiz assim e me retornou esse erro:

 

Argument 2 passed to App\Providers\AuthServiceProvider::App\Providers\{closure}() must be an instance of App\User, string given, called in 

Rodrigo VC
Manager Carlos Ferreira 25/02/2020

Olá, Rodrigo!

É porque o segundo parâmetro deve ser um objeto de User.

Ou você passa um objeto de user, ou não especifica o tipo, ex:
Gate::define('user-edit', function(User $userAuth, $user){
    return $userAuth->id === $user->id;
});

Carlos Ferreira
Criador Rodrigo VC 25/02/2020

Fiz assim e agora ele fala que $user nao é um objeto

 

Trying to get property 'id' of non-object

 

Parecia fácil no vídeo hehehe

Rodrigo VC
Manager Carlos Ferreira 25/02/2020

Debuga isso daqui pra ver o que está chegando:
Gate::define('user-edit', function(User $userAuth, $user){
dd($userAuth);
// depois esse: dd($user);
    return $userAuth->id === $user->id;
});

Carlos Ferreira
Criador Rodrigo VC 25/02/2020
attributes: array:9 [
    "id" => 24
    "name" => "Rodrigo"
    "email" => "[email protected]"
    "email_verified_at" => null
    "password" => "$2y$10$mZdCqpqHKa1uQXjGDeNZ8e6I8aWdLzmn6CSqabwbDbF/XJ6ELwvwy"
    "id_emeasoft" => "cm6000028"
    "remember_token" => null
    "created_at" => "2020-02-26 11:25:23"
    "updated_at" => "2020-02-26 11:25:23"

 

"cm6000028"
Rodrigo VC
Manager Carlos Ferreira 25/02/2020

Olá, Rodrigo!

Observe, no segundo parâmetro do Gate você enviou uma string, e não um objeto.

Me passa o código completo, que te ajudo a identificar onde está errado.

Se tiver passando um ID, precisa usar ele pra validar, exemplo:
Gate::define('user-edit', function(User $user, $id){
    return $user->id === $id;
});

$this->authorize('user-edit', $idAqui);

Carlos Ferreira
Criador Rodrigo VC 25/02/2020

Realmente Carlos, o problema era esse. Agora deu certo. Vou continuar os estudos e obrigado novamente.

Rodrigo VC
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!