[英]How to secure that a user can edit only their own ticket
因此,如果用戶想要編輯自己的工單,他們可以通過表單來完成。 但如果他們更改表單中的 ID,他們也可以編輯另一個用戶的工單。 我該如何防止這種情況?
public function edit(Ticket $ticket)
{
$user = request()->user()->ticket()->get();
if ($ticket === $user){
return view('users.tickets.edit',['ticket' => $ticket,]);
}
else{
abort(403);
}
}
它會自動選擇 abort 403
這是用戶 Model
public function ticket(){
return $this->belongsToMany(Ticket::class, 'ticket_user');
}
這是票 model
public function users() {
return $this->belongsToMany(User::class, 'ticket_user');
}
邏輯本身可能如下所示:
$ticket->users->contains($request->user())
在您的 controller 中,它可能如下所示:
use Illuminate\Http\Request;
public function edit(Request $request, Ticket $ticket)
{
if (! $ticket->users->contains($request->user())) {
return abort(403);
}
return view('users.tickets.edit', [
'ticket' => $ticket
]);
}
對我來說正確的實現看起來像這樣。
型號:
*User
id
...
*Ticket
id
...
UserTicket
*id
*ticket_id
*user_id
創建票證時,您必須為任何能夠編輯票證的用戶創建新的 UserTicket。
然后檢查 UserTicket 中是否有一條記錄具有 user_id。
例如:
票證 model
public function users()
{
return $this->hasManyThrough(UserTicket::class, User::class);
}
和編輯 controller
public function edit(Ticket $ticket)
{
$currentUser = request()->user();
$ticketUsers = $ticket->users;
// loop each ticketUser and check their id == $currentUser->id
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.