Laravel Gates和/或政策

时间:2018-08-09 08:07:53

标签: php laravel

现在,我正在考虑在我的项目中实施政策。 所以我想要三种类型的角色:用户,管理员和办公室。

我有一个具有以下CRUD功能的Customer类:

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功能(因此客户只能对自己的数据使用CRUD功能)。

我阅读了这篇文章: https://code.tutsplus.com/tutorials/gates-and-policies-in-laravel--cms-29780

但是我仍然不知道到底该如何在我的项目中实现它,以及我是否应该使用Gates或策略(似乎策略更容易,还是?)。

如果有人能给我写一个关于如何在我的工作中实现它的示例,我将非常感激。

1 个答案:

答案 0 :(得分:1)

为每个模型创建策略。将策略绑定到路由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;
    }
}

关于如何使用策略的一般想法就这么简单。