我有一个带有销毁方法的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')
也不能与中间件一起使用。 该如何解决?
答案 0 :(得分:0)
destroy函数中的$id
是您要删除的资源的id
,因此它将永远不是经过身份验证的用户ID,检查角色的更好选择可能是{{3 }},而不是中间件。
或通过使用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
的参数的名称。
答案 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');
}
}