Как удалить разрешение из роли только для конкретного пользователя в spatie / laravel -permission? - PullRequest
0 голосов
/ 06 февраля 2020

Допустим, в моей системе три пользователя Sam, John и Sarah. Все три имеют роль editor, которая дает им разрешение на create article, edit article, publish article и delete article. Теперь по какой-то причине я не хочу, чтобы Sam имел разрешение на delete article, но все еще имеет роль editor.

Как мне добиться этого в Laravel с этим пространством / laravel -приемный пакет? (Предположим, что мне, возможно, придется выполнять такую ​​операцию на некоторой регулярной основе, и через некоторое время я могу снова присвоить delete article Sam. И в любой роли слишком много разрешений, поэтому я не могу сделать это вручную.)

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

В вашей базе данных MySQL есть таблица role_has_permissions , в которой хранятся все разрешения вашего article-list , article-create , article-store и article-delete из таблицы разрешений .

Итак, в вашем контроллере вам нужно отменить доступ к этим функциям, подобным этому,

 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>
}
0 голосов
/ 06 февраля 2020

Вы можете создавать собственные политики.

В Политике вы устанавливаете исключение для своего пользователя или группы пользователей.

Для создания и сохранения своей политики. (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;
        }
    }
}
...