Postingan lainnya
Access restrictions laravel method
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. Akan 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
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");
}
}
```
TaskController yang saya maksud untuk proteksi method 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);
}
}
}
```
View index :
```
@foreach($tasks as $task)
<tr>
<td>{{$loop->iteration}}</td>
<td>{{$task->title}} </td>
<td>{{$task->status}}</td>
<td>
<a href="/admin/task/{{$task->id}}/delete" class="btn btn-sm btn-danger" onclick="return confirm('Are you sure?')">
Delete
</a>
<a href="/admin/task/{{$task->id}}/edit" class="btn btn-sm btn-warning">
Edit
</a>
</td>
</tr>
@endforeach
```
Tanggapan
Kalau yang muncul malah task lain saat mengedit, berarti masalahnya , "id" task yang dioper ke fungsi edit memang beda dari yang kamu mau
Itu yang harus dibenahi yang mananya mas berarti?
Belum ada Jawaban. Jadi yang pertama Jawaban
Login untuk ikut Jawaban