برنامه نویسی

ساخت برنامه های ایمن با Permguard و Fastapi

پیش از این ، ما بررسی کردیم که چگونه Django می تواند با PermGuard برای تقویت امنیت برنامه ادغام شود. حال ، بیایید با استفاده از FastAPI به یک مثال مشابه نگاهی بیندازیم.

Permguard یک منبع باز ZTAUTH* برای برنامه های Cloud ، Edge و Multi-Stenant است که از کد برنامه جدا شده است. این یک لایه مجوز متمرکز با استفاده از سیاست به عنوان کد ، امکان اجرای مجوز از هرجای دیگر ، از جمله VM ، ظروف و بدون سرور را فراهم می کند. پرمگارد یک ارائه دهنده مجوز مدرن و منبع باز است که برای پیروی از اصول اعتماد صفر طراحی شده است. از معماری صفر Trust Auth* (ZTAUTH*) استفاده می کند تا اطمینان حاصل شود که هر درخواست دسترسی بدون در نظر گرفتن مرزهای کاربردی یا زمینه ، به طور مداوم تأیید می شود.

ایده اصلی این است که اطمینان حاصل شود که اعتماد هرگز فرض نمی شود بلکه همیشه در مرز برنامه تأیید می شود. ادغام Permguard برای رسیدگی به درخواست های دریافتی ، اطمینان حاصل می کند که هر درخواست قبل از اعطای دسترسی تأیید می شود.

FastAPI یک چارچوب وب مدرن ، سریع (با کارایی بالا) برای ساخت API با Python 3.7+ بر اساس نکات استاندارد پایتون است. این امکان را برای ایجاد آسان API های استراحت با مستندات تعاملی اتوماتیک (با استفاده از UI Swagger) فراهم می کند و به دلیل سرعت و سادگی آن شناخته شده است. FastAPI به گونه ای طراحی شده است که بصری ، آسان برای استفاده و بسیار عملکردی باشد و آن را برای ساخت سریع API در ضمن اطمینان از اعتبار و امنیت داده ها ایده آل می کند.

بر خلاف Django ، که دارای ویژگی های امنیتی داخلی است ، FastAPI مکانیسم های امنیتی یکپارچه ندارد. با این حال ، ما می توانیم امنیت را با استفاده از JWT (JSON Web Tokens) برای مدیریت احراز هویت و PermGuard برای مدیریت مجوز پیاده سازی کنیم.

در FastAPI ، تزریق وابستگی (DI) یک روش قدرتمند برای مدیریت وابستگی های دستگیرندگان مسیر شما (مانند اتصالات پایگاه داده ، کلاس های احراز هویت یا خدمات) به روشی تمیز و جدا شده است. این امکان را به شما می دهد تا منابع یا کارکردهای لازم را به نقاط پایانی خود تزریق کنید بدون اینکه هر بار به صورت دستی آنها را منتقل کنید.

مثال اساسی تزریق وابستگی در Fastapi
بیایید نحوه استفاده از تزریق وابستگی در Fastapi را با یک مثال ساده طی کنیم.

مرحله 1: وابستگی (احراز هویت) را تعریف کنید
بیایید یک وابستگی احراز هویت ساده ایجاد کنیم. این می تواند خدمتی باشد که آیا کاربر یک نشانه معتبر ارائه داده است.

from fastapi import HTTPException, status

class AuthService:
    def authenticate(self, token: str):
        if token != "valid_token":
            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")
        return {"username": "john_doe"}

def get_auth_service():
    return AuthService()
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 2: از وابستگی احراز هویت در یک مسیر استفاده کنید
حال ، بیایید از این سرویس احراز هویت در یک نقطه پایانی استفاده کنیم. ما وابستگی AuthService را با استفاده از بستگی به FastAPI () به کنترل کننده مسیر تزریق خواهیم کرد.

from fastapi import FastAPI, Depends

app = FastAPI()

@app.get("/secure-data/")
def get_secure_data(auth: AuthService = Depends(get_auth_service)):
    # Authenticate with a valid token (for simplicity, we're just using a fixed token here)
    user = auth.authenticate("valid_token")
    return {"message": f"Access granted to {user['username']}"}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال:

بستگی به آن (get_auth_service) نمونه ای از کلاس AuthService را به پارامتر AUTH از کنترل کننده مسیر تزریق می کند.
مسیر get_secure_data از AuthService تزریق شده برای تأیید اعتبار درخواست استفاده می کند.
مرحله 3: استفاده از تزریق وابستگی برای تأیید اعتبار
شما می توانید این مفهوم را برای هر قسمت از برنامه خود که در آن احراز هویت یا مجوز لازم است ، اعمال کنید. تزریق وابستگی باعث می شود که منطق احراز هویت را مدولار سازی کنید و آن را از دستگیرندگان مسیر جداگانه جدا کنید.

وی گفت: “در این مقاله ، ما از همان نمونه ای که قبلاً در Django اعمال شده بود برای نشان دادن نحوه اجرای امنیت در FastAPI استفاده خواهیم کرد. برای توضیح دقیق ، لطفاً به این لینک مراجعه کنید.

https://medium.com/@antonio.radesca/enhancing-authorization-in-django-with-permguard-a-zero-trust-acress-b85b813d252d

ما تمام خط مشی های لازم را در Permguard ایجاد خواهیم کرد و از تزریق وابستگی برای ادغام لایه مجوز در برنامه FastAPI استفاده خواهیم کرد. “

import json
import logging
import os
import uuid


from fastapi import Depends, HTTPException, Request
from permguard.az.azreq.builder_principal import PrincipalBuilder
from permguard.az.azreq.builder_request_atomic import AZAtomicRequestBuilder
from permguard.az_client import AZClient
from permguard.az_config import with_endpoint
from typing_extensions import Annotated


from security_support import User, get_current_user




async def resource_action_evaluate(request: Request, current_user: User, input_string: str):
   try:
       az_client = AZClient(with_endpoint(os.environ.get("host", "127.0.0.1"), os.environ.get("port", 9094)))
       body = await request.body()
       body_json = json.loads(body)
       principal = PrincipalBuilder(current_user.username).build()
       req = (
           AZAtomicRequestBuilder(
               os.environ.get("zone", 197102289968),
               os.environ.get("ledger", "359f7ed82fac42f0a438f4f80174c52a"),
               input_string,
               body_json.get("resource_type"),
               body_json.get("action"),
           )
           .with_request_id(str(uuid.uuid4()))
           .with_principal(principal)
           .with_entities_items("cedar", [])
           .with_subject_role_actor_type()
           .with_subject_source("fastapi")
           .with_subject_property("groups", current_user.groups)
           .with_resource_id(body_json.get("resource_id"))
           .build()
       )


       ok, response = az_client.check(req)
       logging.info(f"Permguard check: {response}")
       if not ok:
           raise HTTPException(status_code=403, detail="Permguard check failed: " + str(response))
       return True
   except Exception as e:
       raise HTTPException(status_code=400, detail=str(e))




def get_resource_action_evaluate(input_string: str):
   async def wrapper(request: Request, current_user: Annotated[User, Depends(get_current_user)]):
       return await resource_action_evaluate(request, current_user, input_string)
   return wrapper
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این کد به منظور ادغام با PermGuard برای ارزیابی اینکه آیا کاربر مجاز به انجام یک عمل بر روی یک منبع است ، طراحی شده است. این شامل چندین مرحله و مؤلفه های کلیدی است که برای رسیدگی به درخواست های مجوز با هم کار می کنند.

نمای کلی
منطق احراز هویت و مجوز:

این کد در اطراف یک تابع ناهمزمان ساخته شده است که ارزیابی می کند که آیا کاربر اجازه انجام یک عمل مشخص را روی یک منبع دارد یا خیر.
هویت کاربر با استفاده از مکانیسم تزریق وابستگی (get_current_user) از درخواست استخراج می شود ، که کاربر معتبر فعلی را بازیابی می کند.
ساخت درخواست مجوز:

وظیفه اصلی ساختن یک درخواست مجوز است که عملی را که کاربر می خواهد انجام دهد ، منبعی که بر روی آن انجام می دهد و هویت کاربر را مشخص می کند.
این کار با استفاده از PrincipalBuilder انجام می شود ، که یک اصلی را به نمایندگی از کاربر فعلی و AzatomicRequestBuilder ایجاد می کند ، که داده های درخواست را سازماندهی می کند.
این درخواست شامل جزئیاتی مانند نقش کاربر ، گروه ها ، نوع منابع و عمل از جمله موارد دیگر است.

ارسال درخواست مجوز:
درخواست ساخته شده از طریق AzClient به سرویس مجوز PermGuard ارسال می شود.
Permguard بررسی می کند که آیا کاربر مجوزهای لازم را برای عملی که می خواهد انجام دهد ، دارد.
پاسخ دادن به پاسخ:

اگر بررسی مجوز موفقیت را بازگرداند ، سیستم ادامه می یابد و کاربر مجاز به عمل است.
اگر چک انجام نشود (یعنی کاربر مجاز نیست) ، خطای HTTP 403 مطرح می شود و به کاربر اطلاع می دهد که اجازه انجام عمل درخواست شده را ندارند.
رسیدگی به خطا:

این کد در یک بلوک آزمایشی پیچیده شده است تا هرگونه خطایی را که ممکن است در طول فرآیند ایجاد شود ، مانند موارد ورودی یا موارد ارتباطی با سرویس مجوز ، انجام شود. در صورت بروز خطا ، پاسخ درخواست بد 400 با پیام خطا بازگردانده می شود.
بررسی مجوز قابل تنظیم:

کد یک تابع کارخانه (get_resource_action_evaluate) را ارائه می دهد که یک تابع بسته بندی ایجاد می کند. این بسته بندی می تواند به عنوان یک کنترل کننده مسیر FastAPI مورد استفاده قرار گیرد ، که امکان ارزیابی پویا از اقدامات و منابع مختلف را بر اساس ورودی منتقل شده به آن فراهم می کند.
مفاهیم کلیدی
تزریق وابستگی: FastAPI از تزریق وابستگی برای مدیریت وابستگی هایی مانند کاربر فعلی استفاده می کند. عملکرد GET_CURRENT_USER وظیفه ارائه کاربر را بر عهده دارد و به طور خودکار به کنترل کننده مسیر تزریق می شود.
ادغام Permguard: کد با سرویس PermGuard ادغام می شود ، که بررسی های مجوز واقعی را انجام می دهد. از کلاس ها و روش های خاص (Azclient ، PrincipalBuilder ، AzatomicRequestBuilder) برای ساخت و ارسال درخواست های مجوز استفاده می کند.
کد مدولار و قابل استفاده مجدد: عملکرد کارخانه باعث می شود که منطق مجوز برای اقدامات یا منابع مختلف بدون تکرار همان کد قابل استفاده و قابل تنظیم باشد.
در اصل ، این کد یک روش امن و کارآمد برای بررسی اینکه آیا کاربر مجاز به انجام اقدامات خاص در مورد منابع است ، استفاده از PermGuard برای بررسی های مجوز و FastAPI برای رسیدگی به درخواست ها و پاسخ های HTTP است.

این عملکرد نحوه محافظت از API ما را با استفاده از وابستگی سفارشی ما نشان می دهد:

@app.post("/items/")
async def read_items(result: dict = Depends(get_resource_action_evaluate("platform-editor"))):
   logging.info(result)
   return {"items": ["item1", "item2"]}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کد منبع کامل در اینجا موجود است:

https://github.com/antrad1978/fastapi-permguard

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا