我在制作中间件时遇到问题,这些中间件会检查用户是否拥有所请求的资源。
例如,如果用户转到/playlists/1/edit
,并且他们不拥有播放列表1,则应显示401错误。
这是我到目前为止所拥有的:
class CheckOwnership {
public function handle(Request $request, Closure $next)
{
if (Playlist::find($request->route()->parameters()['playlists'])->user_id !== $request->user()->id)
{
return response('Unauthorized.', 401);
}
return $next($request);
}
}
这很糟糕,只适用于播放列表资源,但我无法找到更好的方法。
由于
答案 0 :(得分:2)
目前,Laravel 5不支持将参数传递给中间件。我改用会话。
在播放列表控制器上,获取播放列表的所有者并将其存储在会话中。假设您有一个播放列表表,其中包含userID和playlistID列。
public function __construct($playlistID){
$owner = Playlist::where('playlistID',$playlistID)->pluck('userID');
Session::put('OWNER',$owner);
$this->middleware('CheckOwnership',['only'=>'edit']); // apply it to edit function only, assuming you are using a route resource
}
然后,只需在中间件句柄功能上检索它。
public function handle(Request $request, Closure $next)
{
if (Session::get('OWNER') != $request->user()->id)
{
return response('Unauthorized.', 401);
}
return $next($request);
}
到目前为止,这是一个简单的解决方法。我们必须等到Otwell考虑过滤器般的中间件。希望这有帮助!
答案 1 :(得分:2)
使用新添加的表单请求验证可以轻松实现。
您可以在此处详细查看(授权表单请求): http://laravel.com/docs/5.0/validation#form-request-validation
给出的示例实际上是关于用户尝试编辑他们拥有的评论。
提取物:
表单请求类还包含一个authorize方法。在此之内 方法,您可以检查经过身份验证的用户是否确实拥有 更新给定资源的权限。例如,如果是用户 试图更新博客帖子评论,他们真的拥有它 评论
在您的情况下,如果他们不拥有播放列表,则只需从authorize方法返回false。