# Роли и разрешения

Voyager поставляется с ролями и разрешениями из коробки. Каждый *Пользователь* имеет *Роль*, который имеет набор из *Разрешений*.

Внутри панели управлении можно выбрать Добавить, Редактировать или удалить текущие роли. Кроме того, при нажатии на кнопку редактирования определенной роли вы можете указать права BREAD.

![](/files/-ME4ulNH8DAD8Se5eBrD)

Новое в версии 1.0. Мы изменили систему авторизации Voyager на [подробнее в соответствии с Laravel](https://laravel.com/docs/authorization#authorizing-actions-using-policies)! Это означает, что вы можете проверять разрешения следующими способами:

```php
// via user object
$canViewPost = $user->can('read', $post);
$canViewPost = Auth::user()->can('read', $post);

// via controller
$canViewPost = $this->authorize('read', $post);
```

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

* `browse_admin`: Может ли пользователь просматривать админ-панель Voyager или нет.
* `browse_database`: Может ли пользователь просматривать раздел базы данных в меню Voyager или нет.
* `browse_bread`: Может ли пользователь просматривать раздел меню Voyager BREAD или нет.
* `browse_media`: Может ли Пользователь просматривать медиа-раздел Voyager или нет.
* `browse_menu`: Может ли пользователь просматривать раздел меню Voyager или нет.
* `browse_settings`: Может ли пользователь просматривать раздел настроек Voyager или нет.
* `read_settings`: Может ли пользователь просматривать или видеть определенный параметр.
* `edit_settings`: Может ли пользователь редактировать тот или иной параметр или нет.
* `add_settings`: Может ли пользователь добавить новую настройку или нет.
* `delete_settings`: Может ли пользователь удалить определенный параметр или нет.

Дополнительно вы можете `Генерировать права \(Generate permissions\)` для каждого типа BREAD, который вы создаете. Это создаст права на просмотр, чтение, редактирование, добавление и удаление.

В качестве примера, допустим, мы создаем новый тип BREAD из таблицы `products`. Если мы выберем опцию `Generate permissions` для нашей таблицы `products`, то ключами доступа будут `browse_products`, `read_products`, `edit_products`, `add_products` и `delete_products`.

{% hint style="info" %}
**Уведомление**\
Если пункт меню связан с любым типом BREAD, то он будет проверять разрешение `browse`, например, для пункта меню `Posts` BREAD, он будет проверять разрешение `browse_posts`. Если у пользователя нет требуемого разрешения, то этот пункт меню будет скрыт.
{% endhint %}

## Создание разрешений для пользовательской страницы

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

Это работает, только если ваш slug идет сразу после `/admin/`. Таким образом, для пользовательской страницы формы `/admin/sub/foo` пункт меню не будет скрыт из меню.

### Создание разрешения

Сначала создайте разрешение в таблице разрешений (можно использовать BREAD, например, имя модели `TCG\Voyager\Models\Permission`). Столбец `table_name` должен быть равен null. Колонка `key` должна иметь форму `browse_slug`, где `slug` должен быть заменен фактическим slug Вашей пользовательской страницы. Например, чтобы ограничить доступ к вашей пользовательской странице с помощью url `/admin/create_bill`, вы можете создать разрешение `browse_create_bill`.

### Установка роли

Проверьте разрешение для каждой роли, которую вы хотите предоставить доступ к сайту на `admin/roles`. В приведенном выше примере вы найдете новый флажок "Browse Create Bill". Если у пользователя нет требуемого разрешения, то пункт меню, ведущий на вашу пользовательскую страницу, будет скрыт.

### Кастомизация контроллер

Вы можете создать свои собственный [gate](https://laravel.com/docs/authorization#gates)

```php
Gate::define(`browse_create_bill`, function ($user) {
    return $user->hasPermission(`browse_create_bill`);
});
```

Использовать `authorize` в вашем контроллере:

```php
public function index()
{
  $this->authorize('browse_create_bill');
  //..
```

Если вы это сделаете, обязательно добавьте в контроллер пользовательский guard:

```php
  /**
   * Get the guard to be used during authentication.
   *
   * @return \Illuminate\Contracts\Auth\StatefulGuard
   */
  protected function guard()
  {
      return Auth::guard(app('VoyagerGuard'));
  }
```

## Использование разрешений в файлах blade-шаблонов

Вы также можете проверить права доступа, используя синтаксис blade. Допустим, Вы хотите проверить, может ли пользователь `browse_posts`, для этого мы можем использовать следующий синтаксис:

```php
@can('browse', $post)
    I can browse posts
@endcan
```

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

```php
@can('browse', $post)
    I can browse posts
@else
    I cannot browse posts
@endcan
```

Не может быть проще, правда ;).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://delphinpro.gitbook.io/voyager-ru/core-concepts/roles-and-permissions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
