簡體   English   中英

如何確保用戶只能編輯自己的票證

[英]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
    ]);
}

Collection::contains的文檔。

我建議研究如何將您的授權邏輯排除在政策中。

對我來說正確的實現看起來像這樣。

型號:

*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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM