Я новичок в Laravel
и есть маленький вопрос.
Я хочу добиться, чтобы только Создатель / Владелец сообщения мог редактировать / просматривать / удалять его.
Каждое сообщение принадлежит пользователю, и каждый пользователь может иметь несколько сообщений (отношение 1-ко-многим). Эта часть работает как шарм.
Чтобы быть более конкретным, если один из этих маршрутов называется:
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)
приложение должно проверить, совпадает ли идентификатор пользователя, прошедшего аутентификацию, с полем 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']]);
});
Но это решение кажется мне немного грязным. Я должен был бы создать новый фильтр для каждой Модели, и я не могу использовать находчивую маршрутизацию (по крайней мере, не полностью).
Есть ли лучший способ добиться такого поведения?
Я смог решить это с помощью промежуточного программного обеспечения. Следующий код работает, только если привязка модели маршрута для параметра «активна».
Я действительно не знаю, является ли это правильным способом сделать это, но это похоже на работу …
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);
}
ты должен использовать Gate
или встроенный can
промежуточное программное обеспечение для этой цели согласно официальной документации (https://laravel.com/docs/5.3/authorization)