Прямо сейчас я подумываю о внедрении политик в свой проект. Итак, мне нужны 3 типа ролей: пользователь, администратор и офис.
У меня есть класс Customer, который имеет следующие функции CRUD:
class CustomerController extends Controller
{
public function getAllCustomer()
{
return Customer::get();
}
public function addNewCustomer(Request $request)
{
$validatedData = $request->validate([
'Title' => 'required',
'Name' => 'required|max:255',
'Surname' => 'required|max:255',
'Email' => 'required',
'Phone' => 'required',
'Password' => 'required',
'dateofBirth' => 'required'
]);
return \app\model\Customer::create($request->all());
}
public function update (Request $request , Customer $id)
{
$id->update($request->all());
}
public function destroy (Customer $id)
{
$id->delete();
}
Я хочу, чтобы только администратор мог использовать функции CRUD для всех клиентов. Пользователь должен иметь возможность использовать функции CRUD только для своих собственных данных (поэтому Клиент может делать это только со своими собственными данными).
Я прочитал эту статью: https://code.tutsplus.com/tutorials/gates-and-policies-in-laravel--cms-29780
Но я до сих пор точно не знаю, как реализовать это в моем проекте и следует ли мне использовать Gates или политики (похоже, политики проще, или?).
Я был бы очень благодарен, если бы кто-нибудь мог написать мне пример того, как реализовать это в моей работе.
Да, но я не нашел решения для разных ролевых моделей.






Создайте политики для каждой вашей модели. Привязать политики к маршрутам https://laravel.com/docs/5.6/authorization#via-middleware
Route::post('/post/{post}', function () {
// The current user may edit post...
})->middleware('can:edit,post');
Создайте родительскую политику, которую будут расширять все другие политики, и добавьте к ней метод перед, который в основном проверяет, является ли ваш пользователь администратором, и если да, то дальнейшая проверка не требуется.
public function before(User $authenticatedUser, $ability)
{
// super admin can access everything
if ($authenticatedUser->role == 'super_admin') {
return true;
}
return null; //fall through to the policy method
}
Создайте политику публикации, которая будет иметь проверку прав редактировать
class PostPolicy extends Policy
{
public function edit(User $authenticatedUser, Post $post)
{
return $authenticatedUser->id == $post->author_id;
}
}
Общая идея о том, как работать с политиками, очень проста.
вы читали официальную документацию? laravel.com/docs/5.6/authorization