Laravel 5 - 只有所有者(创建者)可以 edit/delete/view 进入
Laravel 5 - Only Owner (creator) can edit/delete/view Entry
我是 Laravel
的新手,有一个小问题。
我想实现 post 的 Creator/Owner 可以 edit/view/delete 它。
每个 Post 属于一个用户,每个用户可以有多个 Post(一对多关系)。那部分就像一个魅力。
更具体地说,如果调用这些路由之一:
GET mydomain.com/posts/{id} (show)
GET mydomain.com/posts/{id}/edit (edit)
PUT mydomain.com/posts/{id} (update)
DELETE mydomain.com/posts/{id} (destroy)
应用程序应检查当前经过身份验证的用户的 ID 是否与 posts user_id 字段匹配。
据我所知,这对于中间件来说是不可能的,因为中间件无法访问当前的 Post-Object 并且我无法将参数传递给它。
目前我能够通过过滤器实现我的目标(我使用 Route-Model 绑定)。
Route::filter('isOwnerOfPost', function() {
if(Route::input('posts')->user_id !== \Auth::id()) {
abort(403);
};
});
Route::get('posts', 'PostController@index');
Route::group(['before' => 'isOwnerOfPost'], function(){
Route::resource('posts', 'PostController', ['except' => ['index', 'create', 'store']]);
});
但是这个解决方案对我来说似乎有点混乱。我将不得不为每个模型创建一个新的过滤器,我不能使用足智多谋的路由(至少不能完全使用)。
有没有更好的方法来完成这样的行为?
我用中间件解决了。以下代码仅在参数的路由模型绑定为 'active'.
时有效
我真的不知道这样做是否正确,但它似乎有效...
public function handle($request, Closure $next)
{
$requestParameters = $request->route()->parameters();
foreach ($requestParameters as $requestParameter) {
// Loop through route parameters
if (gettype($requestParameter) === "object") {
// Route Model Binding is active for this parameter
if (isset($requestParameter->user_id)) {
// Model has an owner (column user_id is set)
$owner = $requestParameter->user_id;
if ($owner !== Auth::id()) {
// Authenticated user is the not owner
abort(403);
}
}
}
}
return $next($request);
}
根据官方文档 (https://laravel.com/docs/5.3/authorization)
,您应该为此目的使用 Gate
或内置 can
中间件
我是 Laravel
的新手,有一个小问题。
我想实现 post 的 Creator/Owner 可以 edit/view/delete 它。
每个 Post 属于一个用户,每个用户可以有多个 Post(一对多关系)。那部分就像一个魅力。
更具体地说,如果调用这些路由之一:
GET mydomain.com/posts/{id} (show)
GET mydomain.com/posts/{id}/edit (edit)
PUT mydomain.com/posts/{id} (update)
DELETE mydomain.com/posts/{id} (destroy)
应用程序应检查当前经过身份验证的用户的 ID 是否与 posts user_id 字段匹配。
据我所知,这对于中间件来说是不可能的,因为中间件无法访问当前的 Post-Object 并且我无法将参数传递给它。
目前我能够通过过滤器实现我的目标(我使用 Route-Model 绑定)。
Route::filter('isOwnerOfPost', function() {
if(Route::input('posts')->user_id !== \Auth::id()) {
abort(403);
};
});
Route::get('posts', 'PostController@index');
Route::group(['before' => 'isOwnerOfPost'], function(){
Route::resource('posts', 'PostController', ['except' => ['index', 'create', 'store']]);
});
但是这个解决方案对我来说似乎有点混乱。我将不得不为每个模型创建一个新的过滤器,我不能使用足智多谋的路由(至少不能完全使用)。
有没有更好的方法来完成这样的行为?
我用中间件解决了。以下代码仅在参数的路由模型绑定为 'active'.
时有效我真的不知道这样做是否正确,但它似乎有效...
public function handle($request, Closure $next)
{
$requestParameters = $request->route()->parameters();
foreach ($requestParameters as $requestParameter) {
// Loop through route parameters
if (gettype($requestParameter) === "object") {
// Route Model Binding is active for this parameter
if (isset($requestParameter->user_id)) {
// Model has an owner (column user_id is set)
$owner = $requestParameter->user_id;
if ($owner !== Auth::id()) {
// Authenticated user is the not owner
abort(403);
}
}
}
}
return $next($request);
}
根据官方文档 (https://laravel.com/docs/5.3/authorization)
,您应该为此目的使用Gate
或内置 can
中间件