Masalah Gerbang Laravel

Saya mencoba memeriksa apakah pengguna diizinkan melihat halaman menggunakan Gates dan Kebijakan di Laravel. Di web.php saya, saya memiliki rute:

$litter = Litter::find($id);

//Security gate
if(Gate::allows('edit-litter', Auth::user(), $litter)){
  return View::make('mykennel.litters.pupsheet')->with([
    //some variables
  ]);
}else{
  $ip_info = log_user_connection('Authorization Error');
  return View::make('errors.authorization')->with([
    'ip_info' => $ip_info,
    'litter_id' => $litter->id,
    'user_id' => Auth::user()->id,
    'litter_user' => $litter->user_id
  ]);
}

Kebijakan saya seperti ini (AuthServiceProvider.php):

public function boot()
  {
      $this->registerPolicies();

      Gate::define('edit-litter', function ($user, $litter) {
          return $user->id == $litter->user_id;
      });
  }

Ketika saya menguji ini, saya hanya mendapatkan kesalahan autentikasi, jadi saya memutuskan untuk memeriksa apakah saya tidak melihat sesuatu dengan mengirimkan variabel-variabel di atas ke tampilan kesalahan, dan tentu saja, user_id sama dengan liter_user (dua hal yang saya saya sedang membandingkan):

{$litter_user}}, {{$user_id}} //returns '55, 55'

Apakah saya melewatkan sesuatu yang jelas? Bantuan apa pun dihargai.


person Vranvs    schedule 18.08.2018    source sumber
comment
Anda tidak meneruskan pengguna ke gerbang ... Anda hanya meneruskan sumber daya, gerbang mengetahui apa yang sudah menjadi pengguna yang diautentikasi Gate::allows('ability', $resourceToCheck)   -  person lagbox    schedule 18.08.2018


Jawaban (1)


Sepertinya Anda memeriksa kemampuan dengan cara yang salah

allows() Fungsi memerlukan dua parameter, yang pertama adalah kemampuan dan yang kedua adalah array argumen

public function allows($ability, $arguments = [])
{
    return $this->check($ability, $arguments);
}

Tapi Anda menyebutnya sebagai:

Gate::allows('edit-litter', Auth::user(), $litter)

Itu bisa menjadi alasan kode Anda tidak berfungsi

Jadi ubah menjadi:

Gate::allows('edit-litter', $litter) 

dan coba lagi karena laravel akan secara otomatis memeriksa pengguna yang diautentikasi.

person Afraz Ahmad    schedule 18.08.2018
comment
senang mendengarnya membantu :) - person Afraz Ahmad; 18.08.2018