Управление идентификацией
Система идентификации PRX обеспечивает области на уровне рабочего пространства и пользователя для всех операций агента. В многотенантных развёртываниях контекст идентификации определяет, к каким воспоминаниям, конфигурациям, инструментам и ресурсам может обращаться данная сессия. Модуль идентификации -- основа для контроля доступа, аудиторского журналирования и персонализации.
Обзор
Каждая сессия PRX работает в контексте идентификации, включающем:
| Компонент | Описание |
|---|---|
| Пользователь | Человек или бот, взаимодействующий с агентом |
| Рабочее пространство | Логическая граница, группирующая пользователей, конфигурации и данные |
| Сессия | Единичный разговор между пользователем и агентом |
| Принципал | Эффективная идентичность для решений контроля доступа |
┌─────────────────────────────────────────┐
│ Рабочее пространство: "acme" │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Пользов. │ │ Пользов. │ ... │
│ │ A │ │ B │ │
│ │ │ │ │ │
│ │ Сессии │ │ Сессии │ │
│ │ Память │ │ Память │ │
│ │ Конфиг. │ │ Конфиг. │ │
│ └──────────┘ └──────────┘ │
│ │
│ Общее: конфигурация, инструменты, ключи│
└─────────────────────────────────────────┘Конфигурация
Настройка рабочего пространства
[identity]
# Включить многотенантную область идентификации.
enabled = true
# Рабочее пространство по умолчанию для сессий, не указавших его.
default_workspace = "default"
# Разрешить пользователям создавать новые рабочие пространства.
allow_workspace_creation = true
# Максимум рабочих пространств на развёртывание.
max_workspaces = 100Профили пользователей
Профили пользователей хранят индивидуальные предпочтения и метаданные:
[identity.profiles]
# Бэкенд хранения профилей пользователей: "memory" | "sqlite" | "postgres"
backend = "sqlite"
path = "~/.local/share/openprx/identities.db"Конфигурация рабочего пространства
Каждое рабочее пространство может иметь собственное наложение конфигурации:
# Переопределения для конкретного рабочего пространства в config.toml
[workspaces.acme]
display_name = "ACME Corp"
default_provider = "openai"
default_model = "gpt-4o"
[workspaces.acme.memory]
backend = "postgres"
[workspaces.acme.security.tool_policy]
default = "supervised"Контекст идентификации
Структура IdentityContext передаётся через весь конвейер обработки запросов. Она содержит: user_id, display_name, workspace_id, session_id, role (Owner/Admin/Member/Guest), channel и произвольные metadata.
Контекст идентификации распространяется через каждый слой: шлюз извлекает его из входящих запросов, цикл агента использует для области памяти и доступа к инструментам, система памяти пространственно разделяет данные по рабочему пространству и пользователю, отслеживание затрат атрибутирует использование, а журнал аудита фиксирует актора.
Мультитенантность
PRX поддерживает многотенантные развёртывания, где несколько организаций используют один экземпляр PRX. Границы тенантности обеспечиваются на уровне рабочего пространства:
Изоляция данных
| Ресурс | Уровень изоляции |
|---|---|
| Воспоминания | По рабочему пространству + по пользователю |
| Конфигурация | Наложение рабочего пространства на глобальные значения по умолчанию |
| Политики инструментов | Переопределения рабочего пространства |
| Секреты | Хранилище рабочего пространства |
| Бюджеты затрат | Лимиты рабочего пространства |
| Журналы аудита | Фильтрация по рабочему пространству |
Межпространственный доступ
По умолчанию пользователи могут обращаться только к ресурсам своего рабочего пространства. Межпространственный доступ требует явной настройки:
[identity.cross_workspace]
# Разрешить администраторам рабочего пространства доступ к другим пространствам.
admin_cross_access = false
# Разрешить конкретным пользователям доступ к нескольким рабочим пространствам.
[[identity.cross_workspace.grants]]
user_id = "shared-bot"
workspaces = ["acme", "beta-corp"]
role = "member"Разрешение пользователей
PRX разрешает идентичность пользователя по-разному в зависимости от канала связи:
| Канал | Источник идентичности | Формат ID пользователя |
|---|---|---|
| Telegram | ID пользователя Telegram | telegram:<user_id> |
| Discord | ID пользователя Discord | discord:<user_id> |
| Slack | ID пользователя Slack | slack:<workspace_id>:<user_id> |
| CLI | Системное имя пользователя | cli:<username> |
| API/Шлюз | Bearer-токен / API-ключ | api:<key_hash> |
| WeChat OpenID | wechat:<open_id> | |
| Номер QQ | qq:<qq_number> |
Регистрация при первом контакте
При первом взаимодействии нового пользователя с PRX запись идентичности создаётся автоматически: адаптер канала извлекает идентификатор пользователя, создаёт профиль с настройками по умолчанию и назначает пользователя в default_workspace с ролью Member.
Ручное управление пользователями
# Список всех известных пользователей
prx identity list
# Показать детали пользователя
prx identity info telegram:123456
# Назначить пользователя в рабочее пространство
prx identity assign telegram:123456 --workspace acme --role admin
# Удалить пользователя из рабочего пространства
prx identity remove telegram:123456 --workspace acme
# Установить метаданные пользователя
prx identity set telegram:123456 --key language --value enУправление рабочими пространствами
# Список всех рабочих пространств
prx workspace list
# Создание нового рабочего пространства
prx workspace create acme --display-name "ACME Corp"
# Показать детали рабочего пространства
prx workspace info acme
# Установить конфигурацию рабочего пространства
prx workspace config acme --set default_provider=anthropic
# Удалить рабочее пространство (требует подтверждения)
prx workspace delete acme --confirmПрофили пользователей
Профили пользователей хранят предпочтения, персонализирующие поведение агента:
| Поле | Тип | Описание |
|---|---|---|
user_id | string | Уникальный идентификатор |
display_name | string | Читаемое имя |
language | string | Предпочтительный язык (ISO 639-1) |
timezone | string | Предпочтительный часовой пояс (формат IANA) |
role | enum | Роль в рабочем пространстве (owner, admin, member, guest) |
preferences | map | Ключ-значение предпочтений (модель, многословность и т.д.) |
created_at | datetime | Временная метка первого взаимодействия |
last_seen_at | datetime | Временная метка последнего взаимодействия |
Доступ к профилю в системных промптах
Системный промпт агента может включать информацию профиля пользователя через шаблонные переменные (напр., {{identity.display_name}}, {{identity.language}}), разрешаемые из контекста идентификации перед отправкой промпта LLM.
Ролевой контроль доступа
Роли рабочего пространства определяют, какие действия может выполнять пользователь:
| Разрешение | Owner | Admin | Member | Guest |
|---|---|---|---|---|
| Использование агента (чат) | Да | Да | Да | Да |
| Сохранение воспоминаний | Да | Да | Да | Нет |
| Настройка инструментов | Да | Да | Нет | Нет |
| Управление пользователями | Да | Да | Нет | Нет |
| Управление рабочим пространством | Да | Нет | Нет | Нет |
| Просмотр журналов аудита | Да | Да | Нет | Нет |
Точки интеграции
При identity.enabled = true все операции с памятью пространственно ограничены по workspace:{workspace_id}:user:{user_id}:{key}, обеспечивая изоляцию данных. Политики инструментов могут переопределяться для каждого рабочего пространства, а использование токенов атрибутируется контексту идентификации для отчётности о затратах по пользователям.
Замечания по безопасности
- Подмена идентичности -- система идентификации доверяет адаптеру канала в правильной идентификации пользователей. Убедитесь, что аутентификация канала настроена корректно (токены ботов, OAuth и т.д.).
- Изоляция рабочих пространств -- границы рабочих пространств обеспечиваются в логике приложения. Базовое хранилище (SQLite, Postgres) не обеспечивает изоляцию на уровне базы данных. Ошибка в логике ограничения области может привести к утечке данных.
- Гостевой доступ -- гости имеют минимальные разрешения по умолчанию. Проверьте конфигурацию гостевой роли при включении публичных агентов.
- Данные профиля -- профили пользователей могут содержать персональные данные. Обрабатывайте в соответствии с вашей политикой конфиденциальности и применимым законодательством.
- Межпространственные права -- предоставляйте межпространственный доступ экономно. Каждое предоставление расширяет зону поражения при компрометации учётной записи.