laravel 中间件中缺少参数请求 ID

In laravel middleware the parameter request id is missing

我有一个 Laravel 带有销毁方法的控制器和名为 CheckRole 的中间件。

public function destroy(Request $request, $id)
{
    // code to delete item
}

我无法在中间件 CheckRole 中使用 $id。

class CheckRole
{
  public function handle($request, Closure $next)
  {

  }
}

$request->id and
$request->route('id')

也不使用中间件。 如何解决这个问题?

destroy 函数中的 $id 是您要删除的资源的 id,因此它永远不会是经过身份验证的用户 ID,检查角色的更好选择可能是 authorization policy 而不是中间件。

或使用以下方式获取经过身份验证的用户 ID:auth()->id()$request->user()->id

您还可以在 User 模型中添加一个方法,然后像这样检查:

class User ...

public function isAdmin()
{
    return $this->role === 'admin';
}

在中间件中

$request->user()->isAdmin();

--- 编辑

因此,如果您在定义路线时使用 resource,例如:

Route::resource('user', 'UsersController');

然后在您的中间件中,您可以像这样访问用户的 id

$request->user

如果你的路线是这样的:

Route::delete('/users/{user}', 'UsersController@destroy');

然后您可以使用命名参数 $request->user 再次获取它。确保您在 {} 中的路线上使用的任何内容都是您用来从中获取 id 的参数的名称。

没有真正安全的方法来执行此操作,因为用户只能在提交的表单中更改 ID,除非您只希望可以登录的用户成为管理员。如果这是真的,我会使用@nakov 的建议。

如果你想拥有一个完整的角色权限系统等,我建议:https://github.com/spatie/laravel-permission

可以在此处找到一个很好的教程,但请不要更改其中使用密码说明的任何内容:https://scotch.io/tutorials/user-authorization-in-laravel-54-with-spatie-laravel-permission

在中间件中获取URL个参数

class CheckRole
{
  public function handle($request, Closure $next)
  {
    $id = $request->route()->parameter('id');
  }
}