diff --git a/auth.py b/auth.py index a2b484b..017767e 100644 --- a/auth.py +++ b/auth.py @@ -57,3 +57,12 @@ async def get_current_admin(token: str = Depends(oauth2_scheme), db: Session = D if admin is None: raise credentials_exception return admin + +async def get_current_super_admin(current_admin: models.Admin = Depends(get_current_admin)): + """Проверяет, является ли текущий админ суперадмином""" + if not current_admin.is_super_admin: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Недостаточно прав. Эта операция доступна только главному администратору." + ) + return current_admin diff --git a/create_admin.py b/create_admin.py index c2801c0..5ca486d 100644 --- a/create_admin.py +++ b/create_admin.py @@ -3,9 +3,9 @@ from models import Admin, Base from database import SessionLocal, engine import argparse -def create_initial_admin(username: str, password: str): +def create_initial_admin(username: str, password: str, super_admin: bool = True): """ - Создает первого администратора в системе + Создает первого администратора в системе (по умолчанию как главного админа) """ Base.metadata.create_all(bind=engine) db = SessionLocal() @@ -18,18 +18,24 @@ def create_initial_admin(username: str, password: str): # Создаем нового админа hashed_password = get_password_hash(password) - db_admin = Admin(username=username, hashed_password=hashed_password) + db_admin = Admin( + username=username, + hashed_password=hashed_password, + is_super_admin=super_admin + ) db.add(db_admin) db.commit() db.refresh(db_admin) - print(f"Администратор {username} успешно создан!") + admin_type = "главный администратор" if super_admin else "администратор" + print(f"{admin_type.capitalize()} {username} успешно создан!") db.close() if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Создание первого администратора") + parser = argparse.ArgumentParser(description="Создание администратора") parser.add_argument("--username", required=True, help="Имя пользователя администратора") parser.add_argument("--password", required=True, help="Пароль администратора") + parser.add_argument("--super", action="store_true", help="Создать как главного администратора") args = parser.parse_args() - create_initial_admin(args.username, args.password) + create_initial_admin(args.username, args.password, args.super) diff --git a/crud.py b/crud.py index 72bf326..6a64cb8 100644 --- a/crud.py +++ b/crud.py @@ -9,7 +9,11 @@ def get_admin_by_username(db: Session, username: str) -> Optional[Admin]: def create_admin(db: Session, admin: schemas.AdminCreate) -> Admin: hashed_password = get_password_hash(admin.password) - db_admin = Admin(username=admin.username, hashed_password=hashed_password) + db_admin = Admin( + username=admin.username, + hashed_password=hashed_password, + is_super_admin=admin.is_super_admin + ) db.add(db_admin) db.commit() db.refresh(db_admin) diff --git a/main.py b/main.py index 6a0f0ec..89a00b8 100644 --- a/main.py +++ b/main.py @@ -47,8 +47,11 @@ async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends( return {"access_token": access_token, "token_type": "bearer"} @app.post("/admins", response_model=schemas.Admin, status_code=status.HTTP_201_CREATED) -def create_admin(admin: schemas.AdminCreate, db: Session = Depends(get_db), current_admin: models.Admin = Depends(auth.get_current_admin)): - # Проверка, что создать админа может только существующий админ +def create_admin( + admin: schemas.AdminCreate, + db: Session = Depends(get_db), + current_admin: models.Admin = Depends(auth.get_current_super_admin) +): db_admin = crud.get_admin_by_username(db, username=admin.username) if db_admin: raise HTTPException( diff --git a/models.py b/models.py index 533f5e2..eda2721 100644 --- a/models.py +++ b/models.py @@ -24,6 +24,7 @@ class Admin(Base): username = Column(String, unique=True, index=True) hashed_password = Column(String) is_active = Column(Boolean, default=True) + is_super_admin = Column(Boolean, default=False) # Новое поле для главного админа class Car(Base): __tablename__ = "cars" diff --git a/schemas.py b/schemas.py index 4430504..fc8d764 100644 --- a/schemas.py +++ b/schemas.py @@ -32,10 +32,12 @@ class AdminBase(BaseModel): class AdminCreate(AdminBase): password: str + is_super_admin: Optional[bool] = False class Admin(AdminBase): id: int is_active: bool + is_super_admin: bool class Config: from_attributes = True @@ -116,4 +118,4 @@ class PersonalResponse(BaseModel): class PersonalListResponse(BaseModel): staff: List[Personal] - total: int \ No newline at end of file + total: int