【问题标题】:In laravel middleware the parameter request id is missing在 laravel 中间件中,缺少参数请求 id
【发布时间】:2019-07-02 14:13:25
【问题描述】:

我有一个 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')

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

【问题讨论】:

  • 你想达到什么目的?为什么在中间件中需要 $id?有什么理由不能将 $id 放入 $request 中?
  • 我需要 $id 来根据角色验证用户并找到应该属于非删除类别的项目
  • 您可以使用$request->user()在中间件中获取用户。

标签: php laravel middleware laravel-5.8


【解决方案1】:

在中间件中获取 URL 参数

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

【讨论】:

  • 你只是拯救了我的夜晚!谢谢
【解决方案2】:

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

或通过使用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 的参数的名称。

【讨论】:

  • 你的意思是我们无法在中间件中使用资源 url 参数
  • 不,我不是这个意思。您可以访问中间件中的参数。检查我的编辑
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多