如何确保用户只能编辑自己的票证

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

这是用户模型

public function ticket(){
    return $this->belongsToMany(Ticket::class, 'ticket_user');
}

这是票模型

public function users() {
    return $this->belongsToMany(User::class, 'ticket_user');
}

对我来说正确的实现是这样的。

模特:

*User
 id
 ...

*Ticket
 id
 ...

 UserTicket
 *id
 *ticket_id
 *user_id
 

当您创建工单时,您必须为任何能够编辑工单的用户创建一个新的 UserTicket。

然后你检查UserTicket中是否有一条记录有user_id.

例如:

Ticket 模型

public function users()
{
    return $this->hasManyThrough(UserTicket::class, User::class);
}

和编辑控制器

public function edit(Ticket $ticket)
{
    $currentUser = request()->user();
    $ticketUsers = $ticket->users;

    // loop each ticketUser and check their id == $currentUser->id

}

逻辑本身可能如下所示:

$ticket->users->contains($request->user())

在你的控制器中它可能看起来像这样:

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 的文档。

我建议研究如何将授权逻辑排除到 gates and policies