feat(auth): نقش سوم «creator» — نویسندهٔ محتوا با دسترسی محدود

- بک‌اند: ستون role برای admin_users (admin/creator) + author_id برای مقاله‌ها
- نقش‌گارد روی کل روتر مدیریتی: creator فقط لیست/ساخت/خواندن/ویرایش
  پیش‌نویس‌های «خودش» را می‌بیند؛ بقیهٔ مسیرهای مدیریتی ۴۰۳
- ساخت توسط creator همیشه پیش‌نویس است و ویرایشش هرگز منتشر نمی‌شود
  (حتی تلاش برای publish در payload نادیده گرفته می‌شود)
- حذف/ترتیب‌بندی/پیام‌ها/خبرنامه/سایر بخش‌ها برای creator ممنوع
- لاگین نقش را برمی‌گرداند؛ پنل: AdminBar نویسنده فقط «نوشتن مقاله» +
  زبان ویرایش + رمز + خروج دارد؛ دکمه‌های انتشار/حذف مقاله فقط برای admin
- ورود creator مستقیم به صفحهٔ نوشتن مقاله هدایت می‌شود
This commit is contained in:
aramesh-site deploy
2026-09-29 08:38:16 +00:00
parent 1b571387df
commit 79813ff52c
10 changed files with 167 additions and 33 deletions
+12 -7
View File
@@ -21,17 +21,14 @@ def verify_password(password: str, hashed: str) -> bool:
return bcrypt.checkpw(password.encode("utf-8"), hashed.encode("utf-8"))
def create_access_token(username: str) -> str:
def create_access_token(username: str, role: str = "admin") -> str:
expire = datetime.now(timezone.utc) + timedelta(minutes=settings.access_token_expire_minutes)
payload = {"sub": username, "exp": expire}
payload = {"sub": username, "role": role, "exp": expire}
return jwt.encode(payload, settings.secret_key, algorithm=settings.algorithm)
def get_current_admin(
token: str = Depends(oauth2_scheme),
db: Session = Depends(get_db),
) -> AdminUser:
"""وابستگی محافظت‌شده — فقط با توکن JWT معتبر دسترسی می‌دهد."""
def get_user_from_token(token: str, db: Session) -> AdminUser:
"""decode توکن و برگرداندن کاربر — هم برای get_current_admin و هم نقش‌گارد"""
credentials_error = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="احراز هویت نامعتبر است",
@@ -50,3 +47,11 @@ def get_current_admin(
if user is None:
raise credentials_error
return user
def get_current_admin(
token: str = Depends(oauth2_scheme),
db: Session = Depends(get_db),
) -> AdminUser:
"""وابستگی محافظت‌شده — فقط با توکن JWT معتبر دسترسی می‌دهد."""
return get_user_from_token(token, db)