260 lines
6.8 KiB
Markdown
260 lines
6.8 KiB
Markdown
|
|
# سیستم دسترسی دو سطحی
|
|||
|
|
|
|||
|
|
این سیستم دسترسیها را در دو سطح جداگانه مدیریت میکند:
|
|||
|
|
|
|||
|
|
## 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
|
|||
|
|
}
|
|||
|
|
```
|