在Laravel中间件中,缺少参数请求ID

时间:2019-07-02 14:13:25

标签: php laravel middleware laravel-5.8

我有一个带有销毁方法的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')

也不能与中间件一起使用。 该如何解决?

3 个答案:

答案 0 :(得分:0)

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

或通过使用auth()->id()$request->user()->id

获取经过身份验证的用户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的参数的名称。

答案 1 :(得分:0)

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

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

可以在此处找到一个很好的教程,但是请不要使用密码https://scotch.io/tutorials/user-authorization-in-laravel-54-with-spatie-laravel-permission

更改其状态。

答案 2 :(得分:0)

在中间件中获取URL参数

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