يأتي SnapOtter مزوَّداً بثلاثة أدوار مدمجة، و17 إذناً دقيقاً، ودعم للأدوار المخصصة مع التحكم الاختياري في الوصول لكل أداة. تغطي هذه الصفحة نموذج التفويض الكامل، وتحديد نطاق مفاتيح API، وإدارة الفرق، وتسجيل التدقيق.
يمكن للمسؤولين إنشاء المستخدمين عبر لوحة الإدارة أو نقطة النهاية `POST /api/auth/register`. لكل مستخدم اسم مستخدم ودور وتعيين فريق وعنوان بريد إلكتروني اختياري.
### المسؤول الافتراضي {#default-admin}
عند أول بدء تشغيل، يُنشئ SnapOtter حساب مسؤول افتراضياً. تأتي بيانات الاعتماد من متغيرات البيئة:
| المتغير | الافتراضي | الوصف |
|---|---|---|
| `DEFAULT_USERNAME` | `admin` | اسم المستخدم لحساب المسؤول الأولي |
يمكن تفويض كافة الأذونات البالغ عددها 17 من خلال الأدوار المخصصة، لكن الإذن الإداري لا يجعل هذا الدور مكافئًا لدور `admin` المضمن. طفرات المستخدم المصرح بها من قبل `users:manage`، والعمليات التدميرية المصرح بها من قبل `compliance:manage`، وإدارة الأدوار المخصصة المصرح بها من قبل `security:manage` مقيدة بالسلطة الحالية للممثل:
- الأدوار المضمنة تتبع `admin` > `editor` > `user`؛ الأدوار المخصصة موجودة أسفل الأدوار المضمنة.
- يجب أن تكون أذونات الهدف متضمنة في أذونات الفاعل **الفعالة**. وبالتالي، لا يمكن لمفتاح واجهة برمجة التطبيقات (API) ذو النطاق ممارسة الأذونات المحذوفة من نطاقه.
- يجب أن يتم احتواء الوصول إلى أداة الدور المستهدف من خلال الوصول إلى الأداة الخاصة بالممثل.
- يتم التحقق من الحساب المعطل مقابل دوره الأصلي عندما يتم تسجيل هذا الدور كـ `disabled:<original-role>`.
- يتطلب حذف دور مخصص أيضًا صلاحية تعيين احتياطي `user` المضمن؛ يظل الأعضاء المعطلون معطلين مثل `disabled:user`.
تعد بيانات الاعتماد والتكوين العالمية أكثر صرامة: يتطلب إصدار أو إلغاء الرمز المميز SCIM واستيراد تكوين المثيل دور `admin` المدمج مع سلطة إدارية فعالة كاملة.
### الأذونات على مستوى الأداة {#tool-level-permissions}
يمكن للأدوار المخصصة اختيارياً تقييد الأدوات التي يمكن للمستخدمين الوصول إليها. يتوفر وضعان:
| الوضع | السلوك | متطلب الترخيص |
|---|---|---|
| `category` | التقييد حسب النمط (صورة، فيديو، صوت، مستند، ملف) | لا شيء (مجاني) |
| `tool` | التقييد حسب معرّف الأداة الفردية | يتطلب ميزة `per_tool_permissions` للمؤسسات |
عند ضبط وضع `tool` لكن ميزة المؤسسات غير متاحة، يتراجع SnapOtter بلطف ويسمح بالوصول إلى جميع الأدوات.
```json
{
"name":"image-only",
"permissions":["tools:use","files:own"],
"toolPermissions":{
"mode":"category",
"allowed":["image"]
}
}
```
### حذف دور مخصص {#deleting-a-custom-role}
عند حذف دور مخصص، يُعاد تعيين جميع المستخدمين المُخصَّصين له تلقائياً إلى الدور `user`.
## الفرق {#teams}
تُجمّع الفرق المستخدمين لإدارة التخزين والاحتفاظ. يُنشأ فريق `Default` عند أول بدء تشغيل.
| الحقل | النوع | الوصف |
|---|---|---|
| `name` | string | اسم فريق فريد (1-50 حرفاً) |
| `storageQuota` | number | حد تخزين لكل فريق بالبايت (يعمل دون المؤسسات) |
| `retentionHours` | number | حذف تلقائي للمخرجات بعد هذا العدد من الساعات (يتطلب `team_retention_overrides`، للمؤسسات) |
| `legalHold` | boolean | منع الحذف التلقائي لملفات أعضاء الفريق (يتطلب `legal_hold`، للمؤسسات) |
::: info
لا يمكن حذف فريق `Default`. لا يمكن حذف الفرق التي لا تزال بها أعضاء. أعِد تعيين الأعضاء أولاً.
:::
## مفاتيح API {#api-keys}
يمكن للمستخدمين توليد مفاتيح API للوصول البرمجي. يستخدم كل مفتاح البادئة `si_` ويُعرَض مرة واحدة فقط وقت الإنشاء.
### الأذونات ذات النطاق {#scoped-permissions}
يمكن لمفاتيح API اختيارياً حمل مصفوفة `permissions`. عند ضبطها، تكون الأذونات الفعّالة للطلب هي **تقاطع** أذونات دور المستخدم والأذونات ذات النطاق للمفتاح. يعني هذا أن مفتاح API لا يمكنه قط التصعيد بما يتجاوز أذونات المستخدم نفسه.
```bash
curl -X POST http://localhost:1349/api/v1/api-keys \