Gagal Memproteksi Method edit laravel (Access Forbidden)

Bismillah, disini saya ingin bertanya mengenai kode yang saya buat untuk memproteksi kemungkinan data dari user lain tidak bisa diakses dan user hanya bisa mengakses data yang telah dibuat si user itu sendiri bukan data user lain. Maka dari itu, saya membuat kodenya di Controller. Namun sebelumnya saya ingin menampilkan Relasi dari 2 Model yakni User dan Task. Nah, nanti yang akan dijadikan bahan proteksi adalah membandingkan id dari user ang sedang aktif atau dari Auth dengan user_id yag ada di table task yang dimana itu telah dibuat oleh user. Aka tetapi, setelah saya coba membandingkan keduanya itu sebelum bisa diakses malah beralih ke data milik user sendiri bukan data yang telah saya buat sendiri. Padahal sudah jelas, pada saat membuat data tersebut saya sudah memasukkan user_id dengan menggunakan Auth::id() namun setelah berhasil dibuat datanya, saya coba edit data yang sudah saya buat dan hasilnya malah data orang lain yang muncul. Padahal datanya sudah saya lihat di database untuk semuanya oke-oke aja bahkan user_id sudah terisi id saya bukan orang lain. Itulah yang menjadi permasalahannya. Mungkin untuk lebih memperjelas bisa melihat kode saya dibawah ini:

Model User

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    protected $table = "users";

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'nickname',
        'google_id',
        'avatar',
        'roles',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    protected $dates = ["created_at","updated_at"];


    public function artikels()
    {
        return $this->hasMany(Artikel::class,"user_id");
    }

    public function tasks()
    {
        return $this->hasMany(Task::class,"user_id");
    }

    public function profile()
    {
        return $this->hasOne(Profile::class,"user_id");
    }
}

Model Task.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    use HasFactory;

    protected $table = "task";

    protected $primaryKey = "id";

    public function user()
    {
        return $this->belongsTo(User::class,"id");
    }
}

Controller yang saya maksudkan untuk diproteksi yaitu edit:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Task;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;

class TaskController extends Controller
{
    public function __construct()
    {
        //
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $data = Auth::user()->tasks()->get();
        return view("Admin.task.index",["tasks" => $data]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            "title" => "required"
        ]);

            DB::table("task")->insert([
                "title" => $request->title,
                "slug" => Str::slug($request->title,"-"),
                "status" => "belum",
                "user_id" => Auth::Id()
            ]);

        return redirect()->back();
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {

        $data = Task::findOrFail($id);
        if(Auth::user()->id == $data->user_id)
        {
        // dd($data);
        return view("Admin.task.edit",["tasks" => $data]);
        }else{
            dd($data->title); // ini malah muncul punya user lain
            dd(Auth::Id()); // ini muncul id user saya sendiri
            return abort(403);
        }

    }

}

Nah, itu dia kode yang saya buat dari mulai Model User dan Task, TaskController. Mungkin ada yang punya solusi dan analisanya

avatar Ihzarizky
@Ihzarizky

39 Kontribusi 9 Poin

Dipost 2 tahun yang lalu

Tanggapan

kalau muncul punya user lain, berarti yang masalah pengambil id dari tasknya, coba cek lagi apakah kamu saat mengakses url edit id tasknya sudah benar atau belum

Sudah, cuman yang muncul malahan data user lain. Routesmya juga sudah betul. Itu kok bisa terjadinya mas. Tadi saya juga pake first

Tadi, sempat bisa diambil datanya cuman pas di halaman view editnya error muncul Property [user_id] does not exist on this collection instance

1 Jawaban:

<div>Bagaimana ya, mungkin Ada yang punya analisa&nbsp;</div>

avatar Ihzarizky
@Ihzarizky

39 Kontribusi 9 Poin

Dipost 2 tahun yang lalu

Login untuk ikut Jawaban