如何确保用户只能编辑自己的票证
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
的文档。
因此,如果用户想要编辑自己的工单,他们可以通过表单来完成。但如果他们更改表单中的 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
的文档。