我有个问题。我需要防止登录的用户可以编辑/查看其他用户的信息更改url中的id。
例如:
URL类似于myapp/users/32/edit,但要更改id,可以编辑其他用户的信息
我试图创建一个中间件,但没有达到预期的效果。我创建了以下内容:
L
<?php
namespace App'Http'Middleware;
use Closure;
use Auth;
class UserSecutiry
{
/**
* Handle an incoming request.
*
* @param 'Illuminate'Http'Request $request
* @param 'Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->user()->id == Auth::id()) {
return $next($request);
}
return redirect()->to('/');
}
}
但是$request->user->id返回我记录的用户id,因此中间件不起作用,并且可以操作任何更改id的用户信息。
我怎样才能完成这项任务。我希望你的帮助。来自智利的问候
开始:
$request->route()->id
你的路线应该是这样的:
Route::get('/test/{id}', [
'middleware' => 'Upping'Http'Middleware'ExtendSessionMiddleware::class,
function ($id) {
dd('some');
}
]);
不适用于全局中间件。
如果$request->user()->id
返回通过URL指定的用户ID,那么您的代码应该可以工作。
URL id | Auth::id() | Condition
-------------------------------
1 | 3 | false
2 | 3 | false
3 | 3 | true
4 | 3 | false
如果$request->user->id
返回记录的用户。然后这样做:
public function handle($request, Closure $next)
{
// find the user who will be edited
$id = $request->route('id');
$userToEdit = 'User::find($id);
if ($userToEdit->getId() === Auth::id()) {
return $next($request);
}
return redirect()->to('/');
}
我假设您的路线有一个用户id的占位符:
Route::get('users/{id}/edit');