如何删除Spatie / laravel权限中仅特定用户的角色权限?

时间:2020-02-06 10:36:29

标签: php laravel spatie

假设我的系统SamJohnSarah中有三个用户。 这三个角色均具有editor的角色,这赋予了他们对create articleedit articlepublish articledelete article的权限。 现在由于某种原因,我不希望Sam拥有对delete article的许可,但仍然拥有editor的角色。

如何使用此spatie / laravel-permission包在Laravel中实现此目标? (假设我可能必须定期执行此操作,并且一段时间后我可能会再次将delete article分配回Sam。而且任何角色的权限太多,因此我无法手动完成。)

2 个答案:

答案 0 :(得分:0)

您可以创建自定义策略。

在“策略”中,为您的用户或用户组设置例外。

创建和保存您的策略。(https://laravel.com/docs/6.x/authorization#creating-policies

示例政策

<?php

namespace App\Policies;

use App\User;
use App\Article;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;


    /**
     * Determine whether the user can delete the article.
     *
     * @param  \App\User $user
     * @param  \App\Post $post
     * @return mixed
     */
    public function delete(User $user, Article $article)
    {
        // retrieve the user as you wish.
        // I just did a check with his name but it is preferable to have a more 
        // advanced identification.

        if ($user->name = 'SAM')) {
            return false;
        }

        if ($user->can('delete article')) {
            return true;
        }
    }
}

答案 1 :(得分:0)

MySQL数据库中有一个表 role_has_permissions ,该表包含您的 article-list article-create 权限表中的>商品存储和商品删除

因此,在您的控制器中,您需要撤消对这些功能的访问,

 function __construct()
    {
        parent::__construct();
        $this->middleware('permission:article-list|article-create|article-store|article-delete', ['only' => ['index']]);
        $this->middleware('permission:article-create', ['only' => ['store']]);
        $this->middleware('permission:article-edit', ['only' => ['update']]);
        $this->middleware('permission:brance-delete', ['only' => ['delete']]);
    }

在刀片中显示类似这样的删除按钮(如果您的用户有权删除文章)

if (Auth::user()->hasPermissionTo('article-delete'))
{
   <button type="button" class="btn btn-danger">Delete Article</button>
}