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