hesabixArc/hesabixAPI/docs/PERMISSIONS_SYSTEM.md

260 lines
6.8 KiB
Markdown
Raw Permalink Normal View History

2025-09-19 15:12:07 +03:30
# سیستم دسترسی دو سطحی
این سیستم دسترسی‌ها را در دو سطح جداگانه مدیریت می‌کند:
## 1. دسترسی‌های اپلیکیشن (App-Level Permissions)
در `users.app_permissions` ذخیره می‌شود و شامل:
### دسترسی‌های موجود:
- `superadmin`: دسترسی کامل به سیستم
- `user_management`: مدیریت کاربران در سطح اپلیکیشن
- `business_management`: مدیریت کسب و کارها
- `system_settings`: دسترسی به تنظیمات سیستم
### مثال JSON:
```json
{
"superadmin": true,
"user_management": true,
"business_management": true
}
```
## 2. دسترسی‌های کسب و کار (Business-Level Permissions)
در `business_permissions.business_permissions` ذخیره می‌شود و شامل:
### بخش‌های موجود:
- `sales`: فروش
- `purchases`: خرید
- `accounting`: حسابداری
- `inventory`: موجودی
- `reports`: گزارش‌ها
- `settings`: تنظیمات کسب و کار
- `marketing`: بازاریابی
### عملیات‌های موجود:
- `read`: خواندن
- `write`: نوشتن
- `delete`: حذف
- `approve`: تأیید
- `export`: صادرات
- `manage_users`: مدیریت کاربران (فقط در settings)
### مثال JSON:
```json
{
"sales": {
"write": true,
"delete": true,
"approve": true
},
"accounting": {
"write": true
},
"reports": {
"export": true
},
"settings": {
"manage_users": true
}
}
```
## نحوه استفاده
### 1. بررسی دسترسی در AuthContext:
```python
# دسترسی‌های اپلیکیشن
ctx.has_app_permission("superadmin")
ctx.is_superadmin()
ctx.can_manage_users()
ctx.can_manage_businesses()
# دسترسی‌های کسب و کار
ctx.has_business_permission("sales", "write")
ctx.can_read_section("sales")
ctx.can_write_section("sales")
ctx.can_delete_section("sales")
ctx.can_approve_section("sales")
ctx.can_export_section("reports")
ctx.can_manage_business_users()
# ترکیب دسترسی‌ها
ctx.has_any_permission("sales", "write") # app یا business
ctx.can_access_business(business_id)
```
### 2. استفاده از Decorator ها:
```python
from app.core.permissions import (
require_superadmin,
require_user_management,
require_sales_write,
require_business_access
)
# دسترسی اپلیکیشن
@require_superadmin()
def admin_function():
pass
@require_user_management()
def manage_users():
pass
# دسترسی کسب و کار
@require_business_access("business_id")
@require_sales_write()
def create_sale(business_id: int):
pass
```
### 3. بررسی دسترسی در API:
```python
@router.post("/business/{business_id}/sales")
def create_sale(
business_id: int,
ctx: AuthContext = Depends(get_current_user)
):
# بررسی دسترسی به کسب و کار
if not ctx.can_access_business(business_id):
raise ApiError("FORBIDDEN", "No access to this business")
# بررسی دسترسی نوشتن فروش
if not ctx.has_business_permission("sales", "write"):
raise ApiError("FORBIDDEN", "No permission to create sales")
# ایجاد فروش
pass
```
## قوانین دسترسی
### 1. SuperAdmin:
- **دسترسی خودکار**: تمام دسترسی‌های اپلیکیشن را خودکار دارد
- **دسترسی کامل**: به تمام بخش‌های سیستم دسترسی دارد
- **دسترسی کسب و کار**: می‌تواند به هر کسب و کاری دسترسی داشته باشد
- **تمام عملیات**: تمام عملیات را می‌تواند انجام دهد
### 2. مالک کسب و کار:
- **دسترسی اپلیکیشن**: فقط دسترسی‌های مشخص شده در `app_permissions`
- **دسترسی خودکار کسب و کار**: تمام دسترسی‌های کسب و کار خود را خودکار دارد
- **دسترسی کامل**: تمام عملیات در کسب و کار خود را می‌تواند انجام دهد
- **مدیریت کاربران**: می‌تواند کاربران کسب و کار خود را مدیریت کند
### 3. کاربران عادی:
- **دسترسی اپلیکیشن**: فقط دسترسی‌های مشخص شده در `app_permissions`
- **دسترسی کسب و کار**: دسترسی‌های مشخص شده در `business_permissions`
- **دسترسی محدود**: فقط به کسب و کارهای خود دسترسی دارند
- **قوانین بخش**: اگر بخش در دسترسی‌ها وجود دارد اما خالی است، فقط خواندن مجاز است
### 3. ذخیره‌سازی بهینه:
- فقط دسترسی‌های موجود ذخیره می‌شود
- `false` یا `null` ذخیره نمی‌شود
- کاهش حجم داده و بهبود عملکرد
## مثال‌های عملی
### کاربر مدیر فروش:
```json
{
"app_permissions": {},
"business_permissions": {
"sales": {
"write": true,
"delete": true,
"approve": true
},
"inventory": {
"write": true
}
}
}
```
### کاربر کارمند حسابداری:
```json
{
"app_permissions": {},
"business_permissions": {
"accounting": {
"write": true
},
"reports": {
"export": true
}
}
}
```
### SuperAdmin:
```json
{
"app_permissions": {
"superadmin": true
},
"business_permissions": {} // دسترسی کامل به همه
}
// نتایج:
// - has_app_permission("user_management") → True (خودکار)
// - has_app_permission("business_management") → True (خودکار)
// - has_business_permission("sales", "write") → True (برای هر کسب و کار)
// - is_superadmin() → True
// - is_business_owner() → False (مگر اینکه مالک کسب و کار باشد)
```
### مالک کسب و کار:
```json
{
"app_permissions": {},
"business_permissions": {
"sales": {"write": true, "delete": true}
}
}
// نتایج:
// - has_app_permission("user_management") → False
// - has_business_permission("sales", "write") → True (از JSON)
// - has_business_permission("accounting", "write") → True (خودکار - مالک)
// - has_business_permission("reports", "export") → True (خودکار - مالک)
// - is_business_owner() → True
```
## توسعه سیستم
### اضافه کردن بخش جدید:
```python
# فقط در business_permissions اضافه می‌شود
{
"new_section": {
"write": true,
"approve": true
}
}
```
### اضافه کردن عملیات جدید:
```python
# در هر بخش قابل اضافه کردن
{
"sales": {
"write": true,
"new_action": true
}
}
```
### اضافه کردن دسترسی اپلیکیشن جدید:
```python
# در app_permissions اضافه می‌شود
{
"new_app_permission": true
}
```