Laravel 5 — Только владелец (создатель) может редактировать / удалять / просматривать запись

Я новичок в 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']]);
});

Но это решение кажется мне немного грязным. Я должен был бы создать новый фильтр для каждой Модели, и я не могу использовать находчивую маршрутизацию (по крайней мере, не полностью).

Есть ли лучший способ добиться такого поведения?

2

Решение

Я смог решить это с помощью промежуточного программного обеспечения. Следующий код работает, только если привязка модели маршрута для параметра «активна».

Я действительно не знаю, является ли это правильным способом сделать это, но это похоже на работу …

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);
}
1

Другие решения

ты должен использовать Gate или встроенный can промежуточное программное обеспечение для этой цели согласно официальной документации (https://laravel.com/docs/5.3/authorization)

0

По вопросам рекламы [email protected]