bp/docs/ACCESS.md

297 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Справка по методам проверки прав доступа
## AccessService — доступ через сервис
AccessService подключается автоматически в BaseController как `$this->access`.
```php
// В контроллере:
if (!$this->access->can('create', 'clients')) {
return $this->forbiddenResponse('Нет прав для создания клиентов');
}
```
---
## Методы проверки ролей
### Проверка конкретной роли
```php
// Одной роли
$this->access->isRole('owner');
// Нескольких ролей
$this->access->isRole(['owner', 'admin']);
```
### Удобные методы для часто используемых проверок
```php
// Владелец организации
$this->access->isOwner();
// Администратор или владелец
$this->access->isAdmin();
// Менеджер, администратор или владелец
$this->access->isManagerOrHigher();
```
### Системные роли (суперадмин)
```php
// Суперадмин (доступ к панели суперадмина)
$this->access->isSuperadmin();
// Системный админ или суперадмин
$this->access->isSystemAdmin();
// Проверка произвольной системной роли
$this->access->isSystemRole('admin');
```
---
## Методы проверки прав на действия
### Универсальный метод can()
```php
// Проверка конкретного действия над ресурсом
$this->access->can('view', 'clients'); // Просмотр клиентов
$this->access->can('create', 'clients'); // Создание клиентов
$this->access->can('edit', 'clients'); // Редактирование клиентов
$this->access->can('delete', 'clients'); // Удаление своих клиентов
$this->access->can('delete_any', 'clients'); // Удаление любых клиентов
```
### Краткие методы для действий
```php
$this->access->canView('clients'); // Эквивалент can('view', 'clients')
$this->access->canCreate('clients'); // Эквивалент can('create', 'clients')
$this->access->canEdit('clients'); // Эквивалент can('edit', 'clients')
$this->access->canDelete('clients'); // Эквивалент can('delete', 'clients')
$this->access->canDelete('clients', true); // Эквивалент can('delete_any', 'clients')
```
### Права на специальные операции
```php
// Управление пользователями организации
$this->access->canManageUsers();
// Управление модулями (подписки)
$this->access->canManageModules();
// Просмотр финансовой информации
$this->access->canViewFinance();
// Удаление организации
$this->access->canDeleteOrganization();
// Передача прав владельца
$this->access->canTransferOwnership();
```
---
## Доступные ресурсы и действия
### Стандартные ресурсы модулей
| Ресурс | Описание | Доступные действия |
|------------|----------------|-------------------------|
| `clients` | Клиенты CRM | view, create, edit, delete, delete_any |
| `deals` | Сделки CRM | view, create, edit, delete, delete_any |
| `bookings` | Записи на приём | view, create, edit, delete, delete_any |
| `projects` | Проекты Proof | view, create, edit, delete, delete_any |
| `tasks` | Задачи | view, create, edit, delete, delete_any |
| `users` | Пользователи | view, create, edit, delete |
---
## Матрица прав по ролям
| Ресурс | Владелец | Администратор | Менеджер | Гость |
|-------------|----------|---------------|----------|-------|
| Клиенты | Полный | Полный | Полный | Просмотр |
| Сделки | Полный | Полный | Полный | Просмотр |
| Записи | Полный | Полный | Полный | Просмотр |
| Проекты | Полный | Полный | Полный | Просмотр |
| Задачи | Полный | Полный | Полный | Просмотр |
| Пользователи| Полный | Просмотр, создание, редактирование | Только просмотр | Просмотр |
| Модули | Полный | Управление | — | — |
| Финансы | Полный | Просмотр | — | — |
---
## Использование в Twig-шаблонах
Хелпер `access` автоматически доступен в шаблонах через TwigGlobalsExtension.
### Проверка ролей
```twig
{# Проверка роли пользователя #}
{% if access.isRole('owner') %}
<p>Вы владелец организации</p>
{% endif %}
{% if access.isRole(['owner', 'admin']) %}
<p>Вы администратор или владелец</p>
{% endif %}
{# Удобные проверки #}
{% if access.isOwner() %}
Кнопка "Удалить организацию"
{% endif %}
{% if access.isAdmin() %}
Кнопка "Управление пользователями"
{% endif %}
```
### Проверка действий
```twig
{# Кнопка создания (видима только если есть право create) #}
{% if access.canCreate('clients') %}
<a href="{{ url('/clients/new') }}" class="btn btn-primary">
Добавить клиента
</a>
{% endif %}
{# Кнопка редактирования #}
{% if access.canEdit('clients') %}
<a href="{{ url('/clients/edit/' ~ client.id) }}">Редактировать</a>
{% endif %}
{# Кнопка удаления #}
{% if access.canDelete('clients') %}
<a href="{{ url('/clients/delete/' ~ client.id) }}">Удалить</a>
{% endif %}
```
### Проверка специальных прав
```twig
{# Управление пользователями #}
{% if access.canManageUsers() %}
<a href="{{ url('/organizations/' ~ currentOrg.id ~ '/users') }}">
Управление пользователями
</a>
{% endif %}
{# Управление модулями #}
{% if access.canManageModules() %}
<a href="{{ url('/modules') }}">Управление подписками</a>
{% endif %}
{# Удаление организации (только владелец) #}
{% if access.canDeleteOrganization() %}
<button class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#deleteOrgModal">
Удалить организацию
</button>
{% endif %}
```
---
## Примеры использования в контроллерах
### Базовый шаблон проверки
```php
public function index()
{
// Проверка права на просмотр
if (!$this->access->canView('clients')) {
return $this->forbiddenResponse('Нет прав для просмотра клиентов');
}
// ... логика метода
}
```
### Проверка нескольких условий
```php
public function delete($id)
{
// Право на удаление
if (!$this->access->canDelete('clients')) {
return $this->forbiddenResponse('Нет прав для удаления');
}
// Дополнительная проверка: только владелец может удалять
if (!$this->access->isOwner()) {
return $this->forbiddenResponse('Только владелец может удалять');
}
// ... логика удаления
}
```
### Условное выполнение в зависимости от роли
```php
public function update($id, $data)
{
// Менеджер может только редактировать свои записи
// Админ и владелец — любые записи
$canEdit = $this->access->isRole('manager')
? $this->isOwnerOfRecord($id) // своя запись?
: true; // любую запись
if (!$canEdit) {
return $this->forbiddenResponse('Можно редактировать только свои записи');
}
// ... обновление
}
```
---
## Важные примечания
1. **Методы возвращают boolean** — используйте в условиях `if`
2. **Проверка всегда идёт для текущей организации** из сессии (`active_org_id`)
3. **Для личного пространства** (`type = 'personal'`) метод `canManageUsers()` возвращает `false` — в личном пространстве нет других пользователей
4. **Системные роли** (`system_role`) проверяются отдельно от ролей организации:
- `isRole()` и `isOwner()`, `isAdmin()` — для организации
- `isSuperadmin()`, `isSystemAdmin()` — для всей системы
5. **Кэширование** — `AccessService` кэширует membership в рамках одного запроса, но не между запросами. При переключении организации кэш сбрасывается автоматически.
---
## Получение текстового названия роли
```php
// В контроллере
$roleLabel = $this->access->getRoleLabel('admin'); // "Администратор"
// В шаблоне
{{ access.getRoleLabel(currentMembership.role) }}
```
---
## Список всех ролей
```php
// Получение всех ролей с описаниями
$roles = \App\Services\AccessService::getAllRoles();
// [
// 'owner' => ['label' => 'Владелец', 'description' => 'Полный доступ', 'level' => 100],
// 'admin' => ['label' => 'Администратор', 'description' => 'Управление пользователями', 'level' => 75],
// ...
// ]
```