Рубрики
Uncategorized

[расширенная рекомендация] роль и контроль полномочий в приложении пространственных / laravel разрешений laravel

Автор оригинала: David Wong.

Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t

Связывание пользователей с ролями

Этот пакет позволяет управлять разрешениями и ролями пользователей в базе данных.

После установки пакета расширения вы можете сделать это:

//Add a permission to the user
$user->givePermissionTo('edit articles');

//Add permissions through roles.
$user->assignRole('writer');

//Add a permission to the role
$role->givePermissionTo('edit articles');

Если вы добавляете несколько охранников к одному пользователю, пакет расширения также может хорошо работать. Каждый охранник, назначенный пользователю, имеет свои собственные разрешения и роли. Прочитайте главу использование нескольких охранников, чтобы получить дополнительную информацию.

Поскольку все разрешения будут зарегистрированы на воротах laravel, вы можете вызвать метод laravel по умолчанию “can”, чтобы проверить, есть ли у пользователя разрешения:

$user->can('edit articles');

Spatie-агентство веб-дизайна, базирующееся в Антверпене, Бельгия. Вы можете найти все проекты с открытым исходным кодом на нашем веб-сайте.

устанавливать

Ларавель

Этот пакет можно использовать в laravel 5.4 или более поздней версии. Если вы используете старую версию laravel, вы можете переключиться на ветвь V1 этого пакета.

Вы можете установить этот пакет через Composer:

composer require spatie/laravel-permission

В laravel 5.5 поставщик услуг будет автоматически зарегистрирован. В старой версии laravel вам нужно добавить его в config/приложение. php Китай:

'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];

Вы можете выполнить миграцию, используя следующую команду:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

Если вы находитесь в Пользователь Используете идентификаторы UUID или GUID в модели, которую вы можете изменить create_permission_tables.php Миграция и замена $таблица->морфы("модель") :

$table->uuid('model_id');
$table->string('model_type');

После публикации миграции вы можете создать таблицу ролей и разрешений, выполнив следующую команду:

php artisan migrate

Вы можете выполнить следующую команду для создания профиля:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

Когда профиль будет опубликован, вы сможете увидеть config/permission.php Включить:

return [

    'models' => [

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * Eloquent model should be used to retrieve your permissions. Of course, it
         * is often just the "Permission" model but you may use whatever you like.
         *
         * The model you want to use as a Permission model needs to implement the
         * `Spatie\Permission\Contracts\Permission` contract.
         */

        'permission' => Spatie\Permission\Models\Permission::class,

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * Eloquent model should be used to retrieve your roles. Of course, it
         * is often just the "Role" model but you may use whatever you like.
         *
         * The model you want to use as a Role model needs to implement the
         * `Spatie\Permission\Contracts\Role` contract.
         */

        'role' => Spatie\Permission\Models\Role::class,

    ],

    'table_names' => [

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your roles. We have chosen a basic
         * default value but you may easily change it to any table you like.
         */

        'roles' => 'roles',

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your permissions. We have chosen a basic
         * default value but you may easily change it to any table you like.
         */

        'permissions' => 'permissions',

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your models permissions. We have chosen a
         * basic default value but you may easily change it to any table you like.
         */

        'model_has_permissions' => 'model_has_permissions',

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your models roles. We have chosen a
         * basic default value but you may easily change it to any table you like.
         */

        'model_has_roles' => 'model_has_roles',

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your roles permissions. We have chosen a
         * basic default value but you may easily change it to any table you like.
         */

        'role_has_permissions' => 'role_has_permissions',
    ],

    /*
     * By default all permissions will be cached for 24 hours unless a permission or
     * role is updated. Then the cache will be flushed immediately.
     */

    'cache_expiration_time' => 60 * 24,
    
    /*
     * When set to true, the required permission/role names are added to the exception
     * message. This could be considered an information leak in some contexts, so
     * the default setting is false here for optimum safety.
     */

    'display_permission_in_exception' => false,
];

Просвет

Установка через Composer:

composer require spatie/laravel-permission

Скопируйте необходимые файлы:

cp vendor/spatie/laravel-permission/config/permission.php config/permission.php
cp vendor/spatie/laravel-permission/database/migrations/create_permission_tables.php.stub database/migrations/2018_01_01_000000_create_permission_tables.php

Другой профиль конфигурация/Другой профиль конфигурация/

curl -Ls https://raw.githubusercontent.com/laravel/lumen-framework/5.5/config/auth.php -o config/auth.php

Теперь выполните миграцию:

php artisan migrate

Далее, в bootstrap/app.php В , зарегистрировать промежуточное программное обеспечение:

$app->routeMiddleware([
    'auth'       => App\Http\Middleware\Authenticate::class,
    'permission' => Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role'       => Spatie\Permission\Middlewares\RoleMiddleware::class,
]);

Аналогичным образом, зарегистрируйте поставщиков конфигурации и услуг:

$app->configure('permission');
$app->register(Spatie\Permission\PermissionServiceProvider::class);

Воспользуйся

Во-первых, добавьте Spatie\Разрешение\Черты\Имеет роли Черта характера к Пользователь Модель:

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
  • Пожалуйста, обратите внимание, что если вам нужно быть в другой модели, например Страница Добавить в Имеет роли Признак, который вам нужно добавить защищен; В этой модели в противном случае будет сообщено об ошибке.
use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;

class Page extends Model
{
   use HasRoles;

   protected $guard_name = 'web'; // or whatever guard you want to use

   // ...
}

Этот пакет позволяет пользователям связываться с разрешениями и ролями. Каждая роль связана с несколькими разрешениями. Роль и Разрешение Все они являются красноречивыми моделями, которые необходимо передавать при их создании имя Этот параметр выглядит следующим образом:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);

Вы можете назначить разрешения ролям одним из следующих способов:

$role->givePermissionTo($permission);
$permission->assignRole($role);

Для назначения роли синхронизации с несколькими разрешениями можно использовать один из следующих методов:

$role->syncPermissions($permissions);
$permission->syncRoles($roles);

Для удаления разрешений с помощью ролей можно использовать один из следующих способов:

$role->revokePermissionTo($permission);
$permission->removeRole($role);

Если вы используете несколько охранников, имя охранника Он должен быть установлен, как указано в разделе использование нескольких защитных устройств.

Имеет Роли Черта имеет красноречивую функцию отношения модели, к которой можно получить прямой доступ или использовать в качестве базового запроса через отношение:

//Get all permissions assigned directly to the user
$permissions = $user->permissions;

//Returns the permissions inherited by all users by assigning roles
$permissions = $user->getAllPermissions();

//Get a collection of all defined roles
$roles = $user - > getrolenames(); // returns a collection

Имеет Роли Черта также была добавлена в вашу модель роль Область позволяет извлекать пользователей с определенными ролями или разрешениями:

$users = user:: role ('writer ') - > get(); // returns the user whose role is' writer'

роль Область получает строку, \Пространство\Разрешение\Модели\Роль Объект или \Подсветка\Поддержка\Коллекция Объект.

Эта особенность также добавляет область, так что вы можете получить только пользователей с определенными разрешениями.

$users = user:: permission ('edit articles') - > get(); // only users with 'edit articles' permission are returned (inherited from roles or directly assigned)

роль Область видимости получает строку, \Пространство\Разрешение\Модели\Разрешение Объект или \Осветить\Поддержка\Коллекция Объект.

Используйте “прямое” разрешение (см. Использование ролей и разрешений ниже).

Назначьте разрешения любому пользователю:

$user->givePermissionTo('edit articles');

// You can also give multiple permission at once
$user->givePermissionTo('edit articles', 'delete articles');

// You may also pass an array
$user->givePermissionTo(['edit articles', 'delete articles']);

Отозвать разрешение пользователя:

$user->revokePermissionTo('edit articles');

Для отмены или добавления разрешений в операции:

$user->syncPermissions(['edit articles', 'delete articles']);

Вы можете определить, имеет ли пользователь это разрешение:

$user->hasPermissionTo('edit articles');

Определите, имеет ли пользователь несколько разрешений:

$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);

После сохранения разрешения оно будет зарегистрировано в Illuminate\Auth\Access\Gate Класс. Таким образом, вы можете использовать метод laravel по умолчанию can , чтобы определить, имеет ли пользователь определенное разрешение:

$user->can('edit articles');

Используйте разрешения с помощью ролей

Роли могут быть назначены любому пользователю:

$user->assignRole('writer');

// You can also assign multiple roles at once
$user->assignRole('writer', 'admin');
// or as an array
$user->assignRole(['writer', 'admin']);

Роли могут быть удалены у пользователя:

$user->removeRole('writer');

Роли также могут быть синхронизированы:

// All current roles will be removed from the user and replaced by the array given
$user->syncRoles(['writer', 'admin']);

Вы можете судить, содержит ли пользователь роль:

$user->hasRole('writer');

Вы также можете определить, содержит ли пользователь одну из заданных ролей:

$user->hasAnyRole(Role::all());

Вы также можете определить, включает ли пользователь все заданные роли:

$user->hasAllRoles(Role::all());

назначить роль , Роль , имеет роль , имеет все Роли и Съемное отверстие Эти функции могут принимать строку, \Пространственное\Разрешение\Модели\Роль Объект или \Подсветка\Поддержка\Коллекция Объект в качестве параметра.

Разрешения могут быть назначены роли:

$role->givePermissionTo('edit articles');

Вы можете судить, содержит ли роль разрешение:

$role->hasPermissionTo('edit articles');

Разрешения также могут быть удалены из роли:

$role->revokePermissionTo('edit articles');

дайте Разрешение и отозвать разрешение На Функция может принимать строку или Пространственное\Разрешение\Модели\Разрешение Объект в качестве параметра.

Разрешения автоматически наследуются от ролей. Кроме того, отдельные разрешения также могут быть назначены пользователям, например:

$role = Role::findByName('writer');
$role->givePermissionTo('edit articles');

$user->assignRole('writer');

$user->givePermissionTo('delete articles');

В приведенном выше примере роли предоставляется право редактировать статью, и роль назначается пользователю. Теперь пользователи могут редактировать и удалять статьи. Разрешение на удаление – это прямое разрешение, назначенное непосредственно пользователю. Когда мы вызываем $user->имеет прямое разрешение("удалить статьи") Он вернется. верно , и ложь Соответствующий $пользователь->имеет прямое разрешение("редактировать статьи") .

Этот метод полезен, если вы устанавливаете разрешения для ролей и пользователей в своем приложении и хотите ограничить или изменить унаследованные разрешения ролей пользователей (разрешается изменять только прямые разрешения пользователей).

Вы можете перечислить эти разрешения:

// Direct permissions
$user->getDirectPermissions() // Or $user->permissions;

// Permissions inherited from the user's roles
$user->getPermissionsViaRoles();

// All permissions which apply on the user (inherited and direct)
$user->getAllPermissions();

Все ответы Spatie\Разрешение\Модели\Разрешение Коллекция этого объекта

Если мы последуем предыдущему примеру, то первым ответом будет удалить статью Вторым ответом будет набор с редактировать статью Набор разрешений, и третий ответ будет содержать предыдущий набор обоих.

Использование синтаксиса блейда

Пакет также добавляет синтаксис блейда, чтобы убедиться, что у текущего вошедшего в систему пользователя есть все или определенная роль.

Вы можете передать второй параметр guard Чтобы извлечь.

Роль синтаксиса блейда

Протестируйте определенную роль:

@role('writer')
    I'm a writer!
@else
   I'm not a writer
@endrole

Сумма составляет

@hasrole('writer')
    I'm a writer!
@else
   I'm not a writer
@endhasrole

Проверьте любую роль в списке входящих:

@hasanyrole($collectionOfRoles)
    I have one or more permissions here
@else
    I don't have any of these rights
@endhasanyrole
// or
@hasanyrole('writer|admin')
    I am a writer or admin
@else
    I'm neither writer nor admin
@endhasanyrole

Тест для всех ролей

@hasallroles($collectionOfRoles)
    I'm all these characters
@else
    I'm not in any of these roles.
@endhasallroles
// or
@hasallroles('writer|admin')
    I am both writer and admin
@else
    I'm not a writer or an admin
@endhasallroles

Шаблоны и разрешения блейда

Это расширение не предоставляет специальных директив блейда, связанных с разрешениями. Вместо этого он использует @can Направьте для проверки разрешений пользователя. Вот каштан:

@can('edit articles')
  //
@endcan

Еще Один Каштан:

@if(auth()->user()->can('edit articles') && $some_other_condition)
  //
@endif

Используйте несколько охранников

При использовании конфигурации аутентификации laravel по умолчанию все методы в приведенном выше примере могут использоваться в обычном режиме без дополнительной настройки. Когда есть несколько охранников, проверка разрешений и ролей немного похожа на пространство имен. Это означает, что у каждого охранника есть роли и разрешения, связанные с его пользовательской моделью.

Используйте разрешения и роли с помощью нескольких охранников

Новые разрешения и роли будут использовать защиту системы по умолчанию по умолчанию( config('auth.defaults.guard') ) При добавлении разрешений и ролей вы можете использовать свойства модели имя охранника Чтобы указать охрану:

// Create a superadmin role for the admin users
$role = Role::create(['guard_name' => 'admin', 'name' => 'superadmin']);

// Define a `publish articles` permission for the admin users belonging to the admin guard
$permission = Permission::create(['guard_name' => 'admin', 'name' => 'publish articles']);

// Define a *different* `publish articles` permission for the regular users belonging to the web guard
$permission = Permission::create(['guard_name' => 'web', 'name' => 'publish articles']);

Убедитесь, что у пользователя есть полномочия указывать охрану:

$user->hasPermissionTo('publish articles', 'admin');

Авторизация пользователя и назначение ролей

Вы можете использовать описанный выше метод, чтобы использовать разрешения через роли для авторизации и назначения ролей пользователям. Только имя охранника Это то же самое, что и защита пользователя, в противном случае он выбросит Защита Не соответствует ненормальная

Несколько предохранителей в директивах по лезвию

Все директивы лезвия одинаковы для нескольких защитников, только имя охранника В качестве второго параметра. Вот каштан:

@role('super-admin', 'admin')
    I am a super-admin!
@else
    I am not a super-admin...
@endrole

Использование промежуточного программного обеспечения

Этот пакет содержит Промежуточное программное обеспечение для ролей и Промежуточное программное обеспечение разрешений Два промежуточных ПО, которые вы можете добавить в app/Http/Kernel.php В документе.

protected $routeMiddleware = [
    // ...
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
];

Вы можете использовать промежуточное программное обеспечение для защиты своих маршрутов:

Route::group(['middleware' => ['role:super-admin']], function () {
    //
});

Route::group(['middleware' => ['permission:publish articles']], function () {
    //
});

Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function () {
    //
});

Кроме того, вы можете | Символ (канал) разделяет роли или разрешения:

Route::group(['middleware' => ['role:super-admin|writer']], function () {
    //
});

Route::group(['middleware' => ['permission:publish articles|edit articles']], function () {
    //
});

Аналогичным образом вы можете защитить свой контроллер, установив необходимое промежуточное программное обеспечение в конструкторе:

public function __construct()
{
    $this->middleware(['role:super-admin','permission:publish articles|edit articles']);
}

Не удалось захватить роли и разрешения

Если вы хотите переопределить значение по умолчанию 403 Ответ, вы можете захватить его с помощью механизма захвата исключений приложения Несанкционированное исключение Исключение:

public function render($request, Exception $exception)
{
    if ($exception instanceof \Spatie\Permission\Exceptions\UnauthorizedException) {
        // Code here ...
    }

    return parent::render($request, $exception);
}

Использование команды artisan

Вы можете создавать роли и разрешения с помощью команды artisan из консоли.

php artisan permission:create-role writer
php artisan permission:create-permission "edit articles"

При создании ролей и разрешений для определенного охранника вы можете использовать имя охранника в качестве второго параметра:

php artisan permission:create-role writer web
php artisan permission:create-permission "edit articles" web

модульное тестирование

В тестах вашего приложения, если вы этого не сделаете setUp() В рамках теста вы, скорее всего, столкнетесь с проблемой “сначала курица или сначала яйцо”. Роль и разрешение не были зарегистрированы на лицевой стороне двери (потому что вы проверяете их после регистрации лицевой стороны двери). Решить эту проблему очень просто: просто добавьте в свой тест следующее Настройка() Способ перерегистрации разрешений:

public function setUp()
    {
        //First, call the setup () method of the following parent class as normal
        parent::setUp();

        //Re register roles and permissions now
        $this->app->make(\Spatie\Permission\PermissionRegistrar::class)->registerPermissions();
    }

Население базы данных

Есть два момента, которые следует отметить в отношении заполнения базы данных

  1. Лучше всего обновить следующее перед заполнением данных пространственный.разрешение.кэш Чтобы избежать ошибок конфликта кэша, вы можете использовать команду artisan (см. раздел Устранение неполадок позже: раздел кэш) или очистить кэш непосредственно в классе сеялки (см. Пример ниже).
  2. Вот пример заполнения данных. Он очищает кэш, создает разрешения и назначает разрешения ролям:

расширять

Если вы хотите расширить существующий Роль возможно Разрешение Модель, пожалуйста, обратите внимание:

  • Ваш Роль Модель должна быть унаследована
  • Spatie\Разрешение\Модели\Роль Модель
  • Ваша Разрешение Модель должна быть унаследована Spatie\Разрешение\Модели\Разрешение Модель

Если вам нужно заменить существующий Роль возможно Разрешение Модель, помните:

  • Ваш Роль Модель должна быть реализована
  • Spatie\Разрешение\Контракты\Роль
  • Ваше Разрешение Необходимо для достижения Spatie\Разрешение\Контракты\Разрешение

В обоих случаях, будь то расширение или замена, вам необходимо указать свою новую модель в конфигурации, чтобы сделать это, вы должны обновить модели.роль и модели.разрешение Эти две ценности. С помощью следующей команды:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

кэш

Данные ролей и разрешений хранятся в кэше для повышения производительности.

При использовании методов, предоставляемых для управления ролями и разрешениями, кэш автоматически сбрасывается:

$user->assignRole('writer');
$user->removeRole('writer');
$user->syncRoles(params);
$role->givePermissionTo('edit articles');
$role->revokePermissionTo('edit articles');
$role->syncPermissions(params);
$permission->assignRole('writer');
$permission->removeRole('writer');
$permission->syncRoles(params);

Однако, если вы управляете данными разрешений и ролей непосредственно через базу данных, а не вызываете предоставленные нами методы, приложение не покажет внесенные вами изменения, если вы вручную не сбросите кэш.

Сброс кэша вручную

Чтобы вручную сбросить кэш для этого пакета расширения, выполните команду:

php artisan cache:forget spatie.permission.cache

Идентификатор кэша

Совет: если вы используете что-то вроде redis или memcached Если вы используете службы кэширования или другие веб-сайты на своем сервере, вы можете столкнуться с конфликтами кэша, поэтому разумно установить свой собственный префикс кэша. остаться /конфигурация/cache.php Для каждого приложения в файле установлен уникальный идентификатор, который предотвратит случайное использование или изменение ваших кэшированных данных другими приложениями.

Нужен пользовательский интерфейс?

Этот пакет расширений не имеет пользовательского интерфейса, вам нужно создать его самостоятельно, пожалуйста, обратитесь к этому руководству Калеба Оки.

тест

composer test

Журнал обновлений

Смотрите журнал обновлений для получения более свежих обновлений

Код вклада

Подробности см. в разделе Код вклада.

безопасность

Если вы обнаружите какие-либо проблемы, связанные с безопасностью, пожалуйста, напишите [email protected] вместо использования средства отслеживания проблем.

Открытка

Вы можете использовать этот пакет расширения бесплатно, но если вы используете его в производственной среде, мы будем признательны, если вы пришлете нам открытку с сообщением, какой пакет расширения мы используем.

Наш адрес: спати, самберстраат 69d, 2060 Антверпен, Бельгия

Мы разместили все полученные нами открытки на веб-сайте компании.

Подтверждение

  • Freek Van der Herten
  • Все Участники

Этот пакет расширения в значительной степени основан на курсах Джеффри Уэй “Классные laracasts” по разрешениям и ролям. Это его исходный адрес в этом репозитории на GitHub

Благодарим, в частности, Алекса Вандербильта за его большую помощь с V2 и Криса Брауна, который долгое время помогал нам поддерживать этот пакет расширений.

Ресурсы

  • Как создать пользовательский интерфейс для управления разрешениями и ролями

Выбор

Сравнение приведено в статье повиласа коропа в laravel news. Он использует разрешение laravel и вышибалу Джозефа Зильбера) для сравнения, что также является отличным дополнением в нашей книге.

Поддержите нас

Spatie-агентство веб-дизайна в Антверпене, Бельгия. Вы можете ознакомиться с обзором наших проектов с открытым исходным кодом на нашем веб-сайте.

Зависит ли ваш бизнес от нашего вклада, Поддержите нас в patreon. Деньги пойдут на поддержание старых продуктов и разработку новых.

Разрешать

С license. Для получения дополнительной информации см. Файл лицензии.

Оригинал: “https://developpaper.com/extended-recommendation-role-and-authority-control-in-spatial-laravel-permission-laravel-application/”